Command Post 7.0 User's Manual 31-May-90 For IBM, PC/XT, PC/AT, PS/2 and compatibles Wilson WindowWare 2701 California Ave SW ste 212 Seattle, WA 98116 Orders:(800) 762-8383 Support: (206) 937-9335 Fax: (206) 935-7129 Copyright 1988-1990 by Morrie Wilson. All rights reserved. No part of this manual may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying and recording, for any purpose without the express written permission of Wilson WindowWare. Information in this document is subject to change without notice and does not represent a commitment by Wilson WindowWare. The software described herein is furnished under a license agreement. It is against the law to copy this software under any circumstances except as provided by the license agreement. U.S. Government Restricted Rights Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subdivision (b)(3)(ii) of the Rights in Technical Data and Computer Software clause at 252.227-7013. Contractor/manufacturer is Wilson WindowWare/2701 California Ave SW /ste 212/Seattle, WA 98116 Trademarks IBM, PC/XT, PC/AT, and PS/2 are registered trademarks of International Business Machines Corporation. Microsoft and MS-DOS are registered trademarks of Microsoft Corporation. Windows is a trademark of Microsoft Corporation. PageMaker is a trademark of Aldus Corporation. PubTech and BatchWorks are registered trademarks of Publishing Technologies, Inc. JELL-O is a registered trademark of General Foods Corporation. Command Post is a trademark of Wilson WindowWare. ii CONTENTS CONTENTS CONTENTS iii INTRODUCTION v System Requirements v About This Manual v Notational Conventions v Acknowledgements vi GETTING STARTED 1 TEN-MINUTE TOUR 3 Selecting and navigating 4 File Management 6 Directory Management 12 Changing the View 14 Housekeeping Functions 16 Edit System Configuration... 20 System Menu Box 21 The Command Post Clock 23 YOUR OWN MENUS 25 What is a Menu File? 25 How to Create a Simple Menu 25 Enhancing Our Menu 26 An Enhancement for Safety 27 The Major Functions 28 Running a Program 28 Getting Info from the User 29 Displaying Information 30 Other Useful Functions 31 COMMAND POST MENU LANGUAGE 35 Menu Structure 35 Menu Items 35 Language Components 36 Constants 36 Identifiers 37 Variables 37 Keywords Are Reserved 38 Operators 38 Precedence and eval order 39 Comments 39 Statements 39 Substitution 40 Language Directives 41 Function Parameters 41 Error Handling 41 iii CONTENTS The Functions & Statements 42 Inputting Information 42 Displaying Information 42 File Management 42 Directory Management 43 Disk Drive Management 43 Window Management 43 Menu Management 44 Program Management 44 String Handling 45 Arithmetic Functions 45 Clipboard Handling 46 System Control 46 CPML FUNCTION REFERENCE 51 Introduction 51 Abs 52 TextBox 128 Version 129 WinClose 132 APPENDIX A Browser 146 APPENDIX B CmdPost and Win 3.0 149 Command Post as Your Shell 149 APPENDIX C Programming Tricks 151 Fun With Filenames 151 Making a Free-Floating Menu 152 Program is Already Running 152 Working With Lists 152 Conditional Branching 153 The Command Post Clock 154 APPENDIX D Predefined Constants 155 APPENDIX E Errors 157 Minor Errors 157 Moderate Errors 157 Fatal Errors 158 Index 160 iv INTRODUCTION INTRODUCTION Command Post 7.0 helps you end some of the drudgery of day-to-day tasks when working in Microsoft Windows. How many times have we tired of changing drives, moving through two subdirectories, finding an executable file from among 43 other filenames, double clicking on it, selecting File/Open, then searching for another directory in the listbox because our document happens to be in a different directory than the program! With Command Post you can automate that knowledge of where to move around the disk, which directories to go to, which files you want to work on, what size you prefer your window to be, and so on. System Requirements Command Post 7.0 requires an IBM PC or compatible with a minimum of 640k memory running Microsoft Windows version 2.03 or higher. About This Manual This manual is divided into five sections: First is Getting Started (pg. 1), where we tell you how to install the program. Then we offer a Ten-Minute Tour of the default File Manager window (pg. 3). Next is an introduction to creating Your Own Menus (pg. 25), after which you can start making your own individual routine easier. Then we go into a full description of the Command Post Menu Language (CPML) (pg. 33), and a comprehensive CPML Function Reference (pg. 47) to assist you in making more complex and intelligent menus. Notational Conventions Throughout this manual, we use the following conventions to distinguish elements of text: ALL-CAPS Used for filenames. Boldface Used for important points, programs, function names, and parts of syntax that must appear as shown. System Used for menu names as they appear to the user. Small fixed-width Used for menu program sample code. v INTRODUCTION Acknowledgements Command Post 7.0 designed & written by Morrie Wilson. Additional programming by Michael Davis & Jennifer Palonus. User's Manual designed by Jennifer Palonus. Written by Jennifer Palonus & Morrie Wilson. Our thanks to the many beta-testers for their invaluable comments & suggestions. vi GETTING STARTED GETTING STARTED Command Post is quite easy to install. You will find an appropriate diskette in your Command Post package. Take the diskette and insert it into your floppy drive. The Command Post installation program is itself a Windows application, so make sure Windows is running. If you are in Windows version 2.03 or 2.11: From the MS-DOS Executive, click on the A: or B: drive icon, depending on which floppy drive you used. A directory listing will appear for the Command Post diskette. Doubleclick on the filename INSTALL.EXE. Follow whatever instructions Install gives you. If you are in Windows version 3.0: From the Program Manager, doubleclick on the File Manager icon to run it. When File Manager starts, click on the A: or B: drive icon, depending on which floppy drive you used. A directory tree will appear for the Command Post diskette. You should see a root directory icon. Doubleclick on this icon and a list of filenames will appear. Find the filename INSTALL.EXE and doubleclick on it. Follow whatever instructions Install gives you. Either Version: Install will create the necessary files and place them into a directory it will prompt you for. If Command Post is already run- ning it will close it down it before trying to copy the new program file over the old one. As the installation program finishes it will display the #READ- ME.1ST file. You should take the time to read this file as it contains any late-breaking information about your copy of Command Post. 1 TEN-MINUTE TOUR TEN-MINUTE TOUR Command Post starts up in a window with a listing of the current directory and a menu across the top. All Command Post menus are completely customizable, and defined in a separate "menu file". We've included a default menu file CMDPOST.CPM that creates a menu similar to the Windows 2.x MS-DOS Executive, with some improve- ments. This is what you get if you run Command Post without specifying a menu file. After the default menu, you may see custom menu items that have been defined in a second menu file. Command Post's default menu file calls the file CMDUSER.CPM to get you started: The Command Post window shows your disk drives, the current directory's path, and the filenames and subdirectories in the current directory. 155 TEN-MINUTE TOUR Selecting and navigating Action Mouse Keyboard Click on Type Ctrl + Select a directory icon desired drive Drive with the left letter. button. ________ Click on Use arrow keys Select a desired to place File filename with selection box left button. over desired file. OR: Press first letter of filename to move selection box to next file with that letter. ________ Click on Press the Shift Select additional key while Addn'l filenames with moving Files the left button selection box while pressing over a range of the Shift key. filenames. OR: Click on Press the Ctrl additional key while filenames with moving the right selection box button. over filenames you don't want OR: Drag mouse to select. over a group of additional filenames with the right ________ button pressed. Doubleclick on Place selection Run a desired .EXE box over Program filename. desired program or datafile and OR: press Enter. Doubleclick on datafile name if it has an [extensions] association in WIN.INI 4 TEN-MINUTE TOUR Same as running Same as running Load an a program, a program, Icon except press except press the Shift key Shift+Enter. while clicking ________ the filename. Doubleclick on Place selection Go to a desired subdir- box over Subdirec- ectory name desired tory with the left directory and button. press Enter. ________ Click on Press the Go to a desired Backspace key. Parent directory in Directory the current path string (next to the drive icons) with the left button. 5 TEN-MINUTE TOUR Let's look at the default menu items: File Management Run... Load... These selections launch a pro- gram. Run... starts it as a "normal" window, i.e. not full- screen. Load... starts the program as an icon. In either case a dialog box is displayed asking you for the name of the file you want to start. Whichever file is currently highlight- ed in the directory listing is the default. Browse This menu item runs the Command Post Browser program to view the selected file. This program lets you view the file in a variety of ways. The default is to show the file in Windows' "ANSI text" mode: 6 TEN-MINUTE TOUR Initial Browser View - ANSI Text You can also view the file as "ASCII text", which interprets some special characters differently: Options/ASCII text Browser gives you the ability to filter which lines you view with its Hide & Seek commands. You can hide or show specific lines by entering a word to look for. For instance, the menu item Hide & Seek/Show if... displays this dialog box: ...and (in this example) shows only the lines containing the word "modem": 7 TEN-MINUTE TOUR You can also view a file in hexadecimal format: Options/Hex dump A comprehensive discussion of the Command Post Browser program can be found in Appendix A -- Browser (pg. 142 ). Copy... This menu item lets you copy the selected files to another filename, directory, or drive. A dialog box appears for you to specify the destination pathname. The default is the current directory. 8 TEN-MINUTE TOUR Rename/Move... This selection lets you rename the selected files to another name, or to move them to another directory or drive. If you are moving files you may rename them in the process. Delete File... This menu item lets you delete the selected files. A dialog box will appear to confirm you really want to delete them. Print... This copies the selected file to any standard non-postscript printer. It prompts you for the device to print to. This command is meant to be used with text files only; it doesn't attempt to format the file or otherwise interpret it. 9 TEN-MINUTE TOUR Size of selected files This menu item displays a message box showing you how much space is taken up by the selected files: 10 TEN-MINUTE TOUR Freespace on drives This menu displays a message box showing you how much space is available on your hard drives: Space on A and size of files Space on B and size of files These commands display message boxes showing you how much space is taken up by the selected files vs. how much space is available on your floppy drives: These menu selections are especially useful when you are preparing to copy files to a floppy disk and want to know if you have enough space to receive the files. Extensions... Windows gives you the ability to double-click on a data filename and automatically run a program with it based on the data file's extension. For instance you can doubleclick on a .CRD file and the Cardfile program will pop up and load the file you chose. The "association" between .CRD files and the Cardfile program is stored in the [extensions] section of the WIN.INI file. The File/Extensions... menu displays a dialog box allowing you to add or change the association between the selected file's extension and a program. If you change the association line the new relationship will be recorded in the WIN.INI file. The next time you doubleclick on the file (or any other file with that extension), the associated program will be run with it. This is much simpler than bringing up Notepad and editing the WIN.INI file to change the association. Exit Windows This menu item ends your Windows session. It has the same effect as choosing File/Exit in the MS-DOS Executive screen in Windows version 2.11 or closing the Program Manager in Windows v3.0. 11 TEN-MINUTE TOUR Directory Management Create Directory... This menu item lets you create a subdirectory under the current one: Delete Directory... This menu item lets you delete a subdirectory of the current one: Change Directory... This selection changes the current directory to one you specify: 12 TEN-MINUTE TOUR You can also change directories by doubleclicking on a subdirectory name, clicking on the pathname above the file listing, or pressing backspace to go back up to the parent directory. Format Diskette... This selection formats a diskette in one of your floppy drives by calling the MS-DOS Format program. The first time you choose Format Diskette... after installing Command Post, you are asked what kind of floppy drives your system has. Command Post saves this information in the WIN.INI file for the next time you choose Format Diskette... . 13 TEN-MINUTE TOUR Directory Tree When you select the Dir/Directory Tree menu item, a window is displayed which graphically shows the directory structure of the current drive. You can scroll through the structure, and then click on the directory you want to change to. If you click on a directory with the right button, a whole new Command Post window appears with that directory listed. You can also change the current disk drive by selecting Disks from the directory tree window. Changing the View 14 TEN-MINUTE TOUR Short Long View/Short displays only the filenames, while View/Long also displays the size, and date & time modified. All Partial... Programs These selections determine which filenames are shown. All displays all files in the current directory. Partial... displays a dialog box where you specify one or more wildcarded filenames to show: Selecting Programs shows only those files with an extension of .BAT, .COM, .EXE, or .PIF. By Name, By Date, By Size, By Kind, Unsorted These selections specify how to sort the files in the display. The default is to sort by Name. Sorting by Date shows the most-recently modified files before the older ones. Sorting by Size shows the largest files first. Sorting by Kind displays the files by their extensions. Unsorted produces a list in the same order as you would get from a dir listing in MSDOS. Window Arranging The right column of the View menu contains the window arranging functions. There are four ways Command Post can arrange application windows on the screen for you: 1 Stack 2 Arrange 15 TEN-MINUTE TOUR 3 Arrange in Rows 4 Arrange in Columns Selections 5 through 8 are the same as 1 through 4 except the Command Post window is minimized. When you specify Arrange in Rows and you have more than four open windows, or if you specify Arrange in Columns and there are more than three open windows, Command Post will revert to Arrange. Housekeeping Functions Command Post You can launch a second copy of Command Post while the first is running. This way you can view more than one directory at a time. Also, when you choose File/Copy... or File/Rename/Move..., the destination pathname defaults to the "other" Command Post's directory. Control Panel This selection runs the Windows Control Panel: 16 TEN-MINUTE TOUR Windows 2.11 Control Panel Windows 3.0 Control Panel Clipboard This menu item runs the Windows Clipboard viewer: DOS Prompt This selection runs COMMAND.COM to enable you to work in DOS directly. You can press ALT+ESC to switch back and forth between Windows and DOS, and when you are through using the command-line interface you type "exit" from the DOS prompt to return to Windows. Get Help Cardfile This menu item runs Cardfile with the handy Command Post help file. This gives you a quick reference to all the Command Post Menu Language (CPML) functions and statements. 17 TEN-MINUTE TOUR Reset Options... This menu item lets you change the screen-blanker time, default File/Print... printer device, and installed-disk drive options. System Information This selection shows a message box containing numerous pieces of information about your Windows installation. Program Manager This selection calls up the Windows 3.0 Program Manager. File Manager This selection invokes the Windows 3.0 File Manager. Print Manager This selection runs Windows 3.0 Print Manager. Windows Setup This menu item runs the Windows 3.0 Setup program. This lets you review your current Windows setup configuration and change it if necessary. Edit Command Post Menus This menu item displays a listbox containing all the .CPM files in the current directory: 18 TEN-MINUTE TOUR It then starts the Windows Notepad with the .CPM file you chose: In order to actually use the updated menu file you must select Reload Menu from Command Post's system-box menu. 19 TEN-MINUTE TOUR Edit INI Files This menu item lets you edit a Windows initialization file. If you are using Windows v3.0 you must keep track of multiple .INI files. You will see a listbox containing all the .INI files in the current directory: It then starts the Windows Notepad with the .INI file you chose: If you are running Windows v2.11 there is only one initialization file, WIN.INI, so you will be put directly into Notepad when selecting the menu. Edit System Configuration... This selection runs the Windows 3.0 System Editor. The System Editor allows you to edit the AUTOEXEC.BAT, CONFIG.SYS, WIN.INI, and SYSTEM.INI files. This menu item is disabled if you are running Windows 2.x. 20 TEN-MINUTE TOUR System Menu Box We've made some changes to the system menu box at the upper-left corner of the Command Post window. There are, of course, the standard items: Restore, Move, Size, Minimize, Maximize, Close, (in Windows v3.0) Switch To..., and About Command Post.... In addition we've added: Enter License Info Use this selection to enter your license number and ID when you register your copy of Command Post. Registering brings you wonderful benefits: - Gets rid of that pesky reminder window that comes up every few menu selections. - Entitles you to one hour free telephone support for 90 days. - Gets you the latest version of Command Post. - Gets you your own copy of this manual. - Encourages the authors of this program to continue bringing you new and better products instead of breaking down and getting a real job. Reload Menu This is the selection you must choose after making changes to an active menu file in order to enable the changes. 21 TEN-MINUTE TOUR Exit Windows This is the same as selecting Exit Windows from the File menu. (the second column) The right-hand column of entries contains the names of all the open application windows. You can switch to one of these programs by doubleclicking on its title in the menu. 22 TEN-MINUTE TOUR The Command Post Clock When Command Post starts up you will see a small window in the lower right-hand corner of the screen with the Command Post version number. This window can also act as a digital clock which shows the date, and the time as HH:MM or HH:MM:SS. You can also use the clock to jump back to Command Post if its window is hiding behind something else. Action Mouse Keyboard Click with the Select Change right mouse "CmdPost display button. Clock" from the Command Post system menu's right- hand column. Type a space. Clock's dis- play will toggle from none to HH:MM:SS to HH:MM. Select and Select Close drag slightly. "CmdPost When it is Clock" from inverted, type the Command ALT-F4. Post system menu's right- hand column. Type ALT-F4. Drag with left (not Move mouse button. available) Doubleclick (not Show with the right available) system mouse button. info Doubleclick (not Jump to with the left available) Command button. Post If the Command Post Clock is set to display the time as HH:MM:SS, it will always be visible regardless of any other window at the same location. 23 YOUR OWN MENUS YOUR OWN MENUS The default Command Post menus provide good, basic file-management functions. But the real power in Command Post comes when you add menu items suited to your own needs and preferences. Custom menus are your chance to put Command Post to work in just the way you want. They allow you to change directories and launch applications with just the parameters you need - all from a simple menu choice. You can offer options to the user and save yourself (and others) the task of memorizing your disk layout. There are many possibilities, but we'll start with the simplest and probably most useful task, starting programs, after examining the menu file. What is a Menu File? Menus are defined in ASCII text files (the kind created by Notepad) with the extension .CPM. If you don't specify a .CPM filename when you run Command Post, it uses the default menu file CMDPOST.CPM. You can also bring up another copy of Command Post using a different menu file by double- clicking on any .CPM filename from within Command Post. Every menu file contains menu names which show up on the Command Post menu bar, and menu items in the dropdown menus. For each menu item you'll have one or more lines of commands which Command Post will execute when you choose that item. Your menu will "feel" just like a regular Windows menu, but it will manage things in a way tailored to suit your needs. How to Create a Simple Menu Let's assume you want to keep the default menus Command Post gives you and add your own onto the end of the menu bar. CMDPOST.CPM contains the definitions for the File, Dir, View, and Main menus. It calls another menu file, CMDUSER.CPM, for the custom menus. CMDPOST.CPM contains some very complex programming and is worth taking a look at sometime. For now however let's just stick to modifying CMDUSER.CPM. Using Windows Notepad, open the CMDUSER.CPM file. You can do this by selecting Edit CPM Files from the Main menu. Scroll down to the end of the file. We're going to add a new menu specifically for desktop publishing applications. First off, let's name our new menu. Starting in the first column (at the far left), type: &DTP Apps 25 YOUR OWN MENUS Because it begins in column 1, this entry defines a menu name. The "&" is optional--it defines an Alt-key combination for the entry; Alt-D in this example. It will appear on the Command Post menu bar as "DTP Apps".. Since we intend to use PageMaker for our projects, we'll define a menu item which lets us launch it. On the next line, beginning in the second column (one space in), type: &PageMaker 4.0 Since it begins in column 2, Command Post knows it defines a dropdown menu item. Below this menu item we will enter the commands which let you launch PageMaker. These begin in column 5 or more (or you can tab once). There are almost a hundred functions and commands in the Command Post Menu Language(CPML), but it takes only a few to get started. Well, what did we do to start PageMaker before we had Command Post? We had to make sure we're in the proper drive, find the PageMaker executable file, and doubleclick or run it. We can put those steps in our PageMaker menu with the DirChange and Run functions: &DTP Apps &PageMaker 4.0 DirChange("d:\pm\docs") Run("pm.exe","") DirChange("d:\pm\docs") tells Command Post to change to the D: drive and find the \PM\DOCS subdirectory. Run("pm.exe", "") tells Command Post to launch the PM.EXE application, with no parameters passed to it. Our simple menu is complete. Now save the file and exit Notepad. Then choose Reload Menu from Command Post's system menu box so our new menu will take effect. Enhancing Our Menu Let's imagine that we have a special publishing project ("The Waldorf Salad Cookbook" - should sell millions) that we've been working on over a series of months. It has its own subdirectory, D:\PM\WALDORF, and several PageMaker files - CHPTR1.PM4, CHPTR2.PM4, etc. We would like to have a separate menu item for each chapter so we can start PageMaker with the chapter already loaded. We always use PageMaker at full-screen, so we'd rather not have to press the Maximize box whenever the program starts. Also, we would like to launch the CLIPBRD.EXE utility as an icon, since we check the clipboard often. Let's create the first menu item , which will follow the generic PageMaker 4.0 item we created above. Since this is a submenu item, it starts in column 2: 26 YOUR OWN MENUS PM-&Waldorf DirChange ("d:\pm\waldorf") RunZoom ("pm.exe", "chptr1.pm4") RunIcon ("clipbrd.exe","") Our menu item now does a lot of work for us. The RunZoom command has a new parameter, "chptr1.pm4", which tells PageMaker which file to load when it starts up. The command RunIcon launches the Clipboard viewer as an icon. We could define more menu items for the other chapters, and find ourselves getting to work faster and easier than before. Not to mention helping other people work on the project without getting lost in our particular directory structure. An Enhancement for Safety After spending 45 hours on CHPTR1.PM4, we start to worry a bit about losing our work. We decide to make a diskette backup of our chapter at the beginning of each session. We'll make it a part of the menu! It now looks like this: PM-Waldorf Ch &1 DirChange ("d:\pm\waldorf") ;Backup the current file first... Pause ("Backup Chapter 1","Put Backup disk in Drive A:") FileCopy ("Chptr1.pm4","a:chptr1.pm4",@FALSE) RunZoom ("pm.exe", "chptr1.pm4") RunIcon ("clipbrd.exe","") Our menu changes to the proper directory, and now displays a dialog box with the title "Backup Chapter 1", prompting the user to "Put Backup disk in Drive A:". The Pause function also creates OK and Cancel buttons which let the user get out of the menu item (where did I put that disk???) or continue. If OK is clicked, FileCopy copies the source file CHPTR1.PM4 to the destination A:CHPTR1.PM4. The @FALSE is a CPML constant which specifies that we do not want to prompt the user if the file already exists in the target directory. It's a good idea to put comments in the file when you're trying to accomplish something complex. Comments start with a semicolon; the rest of the line is ignored. This menu item is getting a bit complicated, but look at what we've accomplished. You've automated the backup process, and made it hard to forget. You don't have to memorize all those manual steps, and you don't have to teach them to others. Menus make your life easier, and in this case let you sleep easier too! 27 YOUR OWN MENUS The Major Functions There are almost a hundred functions and commands that make up CPML. But you can create powerful custom menus right away with these eleven: Running a Program You can launch applications in a number of ways: RunIcon (program-name, parameters) Starts a program as an icon at the bottom of the screen. (See pg. 107) Example: &Utilities &Clock RunIcon ("Clock", "") Run (program-name, parameters) Starts a program in a "normal" window. Windows decides where to place the application's window on the screen. (See pg. 105) Example: &Word Processing Edit &MyFile Run ("Notepad", "myfile.txt") RunZoom (program-name, parameters) Starts a program as a full-screen window. (See pg. 108) Example: &Accounting The &BIG spreadsheet RunZoom ("Excel", "bigsheet.xls") 28 YOUR OWN MENUS Getting Information from the User Often you need to have the user enter extra information before you can process a menu request. Here are the simplest ways to do that: AskYesNo (title, question) Displays a dialog box with a given title, posing a question to the user, who may click a Yes, No, or Cancel button. (See pg. 50) Example: &Utilities Delete MyFile... Cont = AskYesNo ("My Menu", "You REALLY want to do this?") Terminate (Cont==@NO, "", "") FileDelete ("MyFile.txt") AskLine (title, prompt, default) Displays a dialog box with a given title, which prompts the user for a line of input. Returns the default if the user just presses the OK button. (See pg. 48) Example: &Word Processing &Edit a file... TheFile = AskLine ("Edit File", "Filename:", CurrentFile()) Run ("Notepad", TheFile) ItemSelect (title, list, delimiter) Displays a listbox filled with items from a list you specify in a string. The items are separated in your string by a delimiter character. Very useful in conjunction with FileItemize, DirItemize, and WinItemize. (See pg. 91) Example: &DTP Apps PM-&Waldorf Project DirChange ("d:\pm\waldorf") WFiles = FileItemize ("chptr*.pm4") TheFile = ItemSelect ("Select A Chapter", WFiles, " ") RunZoom ("pm.exe", TheFile) 29 YOUR OWN MENUS Displaying Information It's easy to display information to the user: Message (title, text) This command displays a message box with a title and text you specify, until the user presses the OK button. (See pg. 97) Example: &Miscellany Show &Date && Time DT = DateTime () Message ("Current Date & Time", "It is now %DT%") Pause (title, text) This command is similar to Message except an exclamation-point icon appears in the message box, and the user can press OK or Cancel. If they press Cancel, the menu item exits. (See pg. 103) Example: &Daily Utilities &Delete .BAK files Pause ("Delete Backups", "Last chance to stop!") ;if it gets this far, they pressed OK... FileDelete ("*.bak") Terminate (expression, title, message) This command stops processing the menu item if the expression is true. If either the title or the message are not null strings (""), then a message box is displayed to alert the user to what has happened. (See pg. 122) Example: &Restricted Operations &Payroll History UsersPW = AskLine ("*RESTRICTED*","Enter your password:","") ;assuming executive's password already saved in WIN.INI: RealPW = IniRead ("MyCompany", "Executive PW", "") Terminate (UsersPW!=RealPW, "ERROR", "Wrong Password!") ;if they got this far, they gave correct password: RunZoom ("Excel.exe", "Personel.xls") 30 YOUR OWN MENUS Other Useful Functions CurrentFile ( ) Returns the name of the selected file (the one with the dotted rectangle around it) from the Command Post window. (See pg. 57) Example: &Editing Run &Notepad with selected file Run ("Notepad", CurrentFile()) DirChange (pathname) Changes the directory to the pathname specified. (See pg. 62) Example: &Miscellany &Run some program not in path DirChange ("c:\some\dir\not\in\path") Run ("Obscure.exe","") 31 COMMAND POST MENU LANGUAGE COMMAND POST MENU LANGUAGE Menu Structure Menus are defined in a menu file. Each menu file consists of one or more lines of menu statements. Each line is terminated with a carriage return / line feed (CRLF) combination and can be up to 256 characters long. There are two main parts of a menu file: The first section, which is optional, is the initialization code. This section is executed once when the menu is first loaded and run. It's located before the first menu item declaration. The remainder of the menu file consists of menu item titles and their associated statements. The code under each menu title is executed when the corresponding menu item is selected. Execution begins at the first statement under a menu item and continues up to the definition of the next item. Menu Items Menu titles can consist of letters, digits, spaces, punctuation marks; in fact any displayable ANSI characters your text editor can create. There are special characters you can use to modify the appearance of items in the menus. & Causes the following character to be underlined in the menu item. The user can select the item by pressing the ALT key with the character instead of using the mouse. | In a main menu, puts this item on a new line. | In a dropdown menu, this item starts a new column. _ Used to create a horizontal bar (in dropdown menus only). Most CPML commands carry out functions based on your menu selections. However there are a few functions (summarized on pg. 42) that can alter the characteristics of the menu titles themselves. For instance you can put a checkmark next to a menu, or disable and gray it. In order to identify a menu item within a CPML statement, each menu item you define has an associated menu name. The menu name is built using only the letters and digits that make up the menu title. Menu names are case-insensitive; you don't have to worry about how the actual menu title is capitalized in order to identify it. 33 COMMAND POST MENU LANGUAGE For menu items in a popup menu, the menu name consists of its parent menu's name, plus the popup menu item's name concatenated at the end. These menu names are valid as soon as the menu file is loaded, so you can use the menu management functions in the initialization code before the menus even appear. Example: PW=AskLine ("","Enter your password:", "") ;assuming the resident guru's pw is already in WIN.INI: RealPW = IniRead ("Our Company", "Tech Guru PW", "") Terminate (PW==RealPW, "Access", "You have FULL access") MenuChange("SystemUtilitiesCleanupDir", @DISABLE) MenuChange("SystemUtilitiesEditBatFiles",@DISABLE) MenuChange("SystemUtilitiesEditWinIni", @DISABLE) Message ("Access", "You have LIMITED access") &System Utilities ;name = "SystemUtilities" &Cleanup Dir ;name = "SystemUtilitiesCleanupDir" ... &Edit BAT Files...;name = "SystemUtilitiesEditBatFiles" ... &Edit WIN.INI ;name = "SystemUtilitiesEditWinIni" ... Language Components The statements you write to execute the menu items are constructed from constants, variables, operators, functions, commands, and comments. Constants The programming language supports both integer and string constants. Integer Constants Integer constants are built from the digits 0 through 9. They can range in magnitude from negative to positive 231 -1 (approximately two billion). Constants larger than these permissible magnitudes will produce unpredictable results. Examples of integer constants: 1 -45 377849 -1999999999 34 COMMAND POST MENU LANGUAGE String Constants String constants are comprised of displayable characters bounded by quote marks. You can use double quotes ("), single quotes ('), or back quotes (`) to enclose a string constant, as long as the same type of quote is used to both start and end it. If you need to imbed the delimiting quote mark inside the string constant, use the delimiting quote mark twice. Examples of string constants: "a" `Betty Boop` "This constant has an imbedded "" mark" 'This constant also has an imbedded " mark' Predefined Constants The programming language has a number of built-in integer constants that can be used for various purposes. These start with the @- sign, and are case-insensitive (although we prefer to use ALL CAPS). Some predefined constants: @FALSE @TILE @NO @TRUE @STACK @YES A list of all the predefined constants can be found in Appendix D: Predefined Constants. Identifiers Identifiers are the names supplied for variables, functions, and commands in your program. An identifier is a sequence of one or more letters or digits that begins with a letter. Identifiers may have up to 30 characters. All identifiers are case insensitive. Upper- and lowercase charac- ters may be mixed at will inside variable names, commands or functions. For example these statements all mean the same thing: AskLine (MyTitle, Prompt, Default) ASKLINE (MYTITLE, PROMPT, DEFAULT) aSkLiNe (MyTiTlE, pRoMpT, dEfAuLt) Variables A variable may contain an integer, a string, or a string representing an integer. Automatic conversions between integers and strings are performed as a matter of course during execution. 35 COMMAND POST MENU LANGUAGE If a function requires a string argument and an integer argument is supplied, the variable will be automatically modified to include the representative string. If a function requires an integer argument and a string argument is supplied, an attempt will be made to convert the string to an inte- ger. If it does not convert successfully, an error will result. Keywords Are Reserved "Keywords" are the predefined identifiers that have special meaning to the programming language. These cannot be used as variable names. CPML keywords consist of the functions, commands, and predefined constants. Some examples of reserved keywords: beep dirchange @Yes filecopy Operators The programming language operators take one operand ("unary operators") or two operands ("binary operators"). Unary operators (integers only): - Arithmetic Negation (Two's complement) + Identity (Unary plus) ~ Bitwise Not. Changes each 0 bit to 1, and vice-versa. ! Logical Not. Produces 0 (@FALSE) if the operand is nonzero, else 1 (@TRUE) if the operand is zero. Binary arithmetic operators (integers only): * Multiplication / Division mod Modulo + Addition - Subtraction << Left Shift >> Right Shift & Bitwise And | Bitwise Or ^ Bitwise Exclusive Or (XOR) && Logical And | | Logical Or Binary relational operators (integers and strings): > Greater-than >= Greater-than or equal 36 COMMAND POST MENU LANGUAGE < Less-than <= Less-than or equal == Equality != or <>Inequality Assignment operator (integers and strings): = Assigns evaluated result of an expression to a variable Precedence and evaluation order The precedence of the operators affect the evaluation of operands in expressions. Operands associated with higher-precedence operators are evaluated before the lower-precedence operators. The table below shows the precedence of the operators. Where operators have the same precedence, they are evaluated from left to right. Operator Description ( ) Parenthetical grouping ~ ! - + Unary operators * / mod Multiplication & Division + - Addition & Subtraction << >> Shift operators < <= == >= > != <> Relational operators & ^ | Bit manipulation operators && | | Logical operators Comments A comment is a sequence of characters that are ignored when processing a menu item. A semicolon (not otherwise part of a string constant) indicates the beginning of a comment. All characters to the right of the semicolon are considered comments and are ignored. Blank lines are also ignored. Examples of comments: ;This is a comment abc=5 ;This is also a comment Statements The statements of a menu specify what to do when the menu item is selected. Assignment Statements Assignment statements are used to set variables to specific or computed values. Variables may be set to integers or strings. 37 COMMAND POST MENU LANGUAGE Examples: a=5 value=Average(a,10,15) location="Northern Hemisphere" World = strcat(location," ","Southern Hemisphere") Control Statements Control statements are generally used to execute system management functions and consist of a call to a command without assigning any return values. Examples: run("clock.exe","") delay(5) winclose("Clock") Exit Substitution The menu language has a powerful substitution feature which inserts the contents of a string variable into a statement before the line is parsed. To substitute the contents of a variable in the statement, simply put a percent-sign (%) on both sides of the variable name. Examples: MyCmd="DirChange('C:\')" ;set MyCmd to a command %MyCmd% ;execute the command ...or consider this one: IniWrite ("PC", "Owner", "Jenny") ... Owner = IniRead ("PC", "Owner", "somebody") message ("", "This is %Owner%'s PC") will produce this message box: To put a single percent-sign (%) on a source line, specify a double percent sign(%%). This is required even inside quoted strings. 38 COMMAND POST MENU LANGUAGE Language Directives A "language directive" is a command to the CPML interpreter, as opposed to a menu statement. These begin with a pound-sign ("#") in column 1. Currently there is only one directive recognized by Command Post: #NextFile. This directive tells the CPML interpreter to append another .CPM file to the current one before building the menus. You can append only one extra menu file in this way. Function Parameters Most of the functions and commands in the language require parameters. These come in three types: Integer String Variable name CPML performs automatic conversions between strings and integers, so in general you can use them interchangeably. Integer parameters may be any of the following: An integer (i.e. 23) A string representing an integer (i.e. "23") A variable containing an integer A variable containing a string representing an integer String parameters may be any of the following: A string An integer A variable containing a string A variable containing an integer Error Handling There are three types of errors that can occur while processing a menu item: Minor, Moderate, and Fatal. What happens when an error occurs depends on the current error mode, which is set with the ErrorMode function. There are three possible modes you can specify: @CANCEL User is notified when any error occurs, and then the menu item is cancelled. This is the default. @NOTIFY User is notified when any error occurs, and has option to continue unless the error is fatal. 39 COMMAND POST MENU LANGUAGE @OFF User is only notified if the error is moderate or fatal. User has option to continue unless the error is fatal. The function LastError returns the code of the most-recent error encountered during the current menu item. Minor errors are numbered from 1000 to 1999. Moderate errors are numbered from 2000 to 2999. Fatal errors are numbered from 3000 to 3999. Error handling is reset to @CANCEL at the start of each menu item. The Functions & Statements Inputting Information AskLine (title, prompt, default) Lets user enter a line of information. AskYesNo (title, question) Lets user choose from Yes, No, or Cancel. ItemSelect (title, list, delimiter) Chooses an item from a listbox. TextBox (title, filename) Fills a listbox from text strings in a file. Displaying Information Beep Beeps at the user. Display (seconds, title, text) Momentarily displays a string. Message (title, text) Displays text in a message box. Pause (title, text) Displays text in a message box. Terminate (expression, title, message) Conditionally ends a menu operation, with a notice if desired. File Management CurrentFile ( ) Returns the selected file or subdirectory name. FileCopy (from-list, to-file, warning) Copies files. 40 COMMAND POST MENU LANGUAGE FileDelete (file-list) Deletes files. FileExist (filename) Determines if a file exists. FileItemize (file-list) Builds a list of files. FileLocate (filename) Finds a file within the current DOS path. FileMove (from-list, to-file, warning) Moves files to another set of pathnames. FileRename (from-list, to-file) Renames files to another set of names. FileSize (file-list) Adds up the total size of a set of files. Directory Management DirChange ([d:]path) Changes the current directory. DirGet ( ) Returns the current directory path. DirHome ( ) Returns the initial directory path. DirItemize (dir-list) Builds a list of directories. DirMake ([d:]path) Creates a new directory. DirRemove ([d:]path) Removes an existing directory. Disk Drive Management DiskFree (drive-list) Returns the amount of free space on a set of drives. LogDisk (drive) Changes the logged disk drive. Window Management WinActivate (partial-windowname) Makes an application window the active window. WinArrange (style) Arranges all running application windows on the screen. 41 COMMAND POST MENU LANGUAGE WinClose (partial-windowname) Closes an application window. WinCloseNot (partial-windowname [, partial-windowname]...) Closes all application windows except those specified. WinGetActive ( ) Gets the title of the active window. WinHide (partial-windowname) Hides an application window. WinIconize (partial-windowname) Turns an application window into an icon. WinItemize ( ) Lists all the main windows currently running. WinPlace (x-ul, y-ul, x-br, y-br, partial-windowname) Changes the size and position of an application window on the screen. WinShow (partial-windowname) Shows a currently-hidden application window. WinTitle (partial-windowname, new-windowname) Changes the title of an application window. WinWaitClose (partial-windowname) Waits until an application window is closed. WinZoom (partial-windowname) Maximizes an application window to full-screen. Menu Management IsMenuChecked (menuitem-name) Determines if a menuitem is checked. IsMenuEnabled (menuitem-name) Determines if a menuitem is enabled. MenuChange (menuitem-name, flags) Modifies displayed characteristics of a menuitem. Program Management Run (program-name, parameters) Runs a program as a normal window. RunHide (program-name, parameters) Runs a program in a hidden window. RunIcon (program-name, parameters) Runs a program as an icon. RunZoom (program-name, parameters) Runs a program in a maximized window. 42 COMMAND POST MENU LANGUAGE String Handling Char2Num (string) Returns the ANSI code of a string's first character. IsNumber (string) Determines if a string represents a valid number. Num2Char (number) Converts a number to the ANSI character it represents. StrCat (string[, string]...) Concatenates strings together. StrCmp (string1, string2) Compares two strings. StrFill (string, string-length) Builds a string from a repeated smaller string. StrFix (base-string, padding-string, length) Pads or truncates a string to a fixed length. StrICmp (string1, string2) Compares two strings, ignoring their case. StrIndex (main-str, sub-str, start, direction) Locates a string within a larger string. StrLen (string) Returns the length of a string StrLower (string) Converts a string to all lower-case characters. StrScan (main-str, delims, start, direction) Finds an occurrence of one or more delimiter characters in a string. StrSub (string, start, length) Returns a substring from within a string. StrTrim (string) Trims leading and trailing blanks from a string. StrUpper (string) Converts a string to all upper-case characters. Arithmetic Functions Abs (number) Returns the absolute value of a number. Average (num [, num]...) Returns the average of a list of integers. Max (num [, num]...) Determines the highest number in a list. 43 COMMAND POST MENU LANGUAGE Min (num [, num]...) Determines the lowest number in a list. Random (max) Generates a positive random number. Clipboard Handling ClipAppend (string) Appends a string to the end of the Clipboard. ClipGet ( ) Returns the Clipboard contents into a string. ClipPut (string) Replaces the Clipboard contents with a string. System Control DateTime ( ) Returns the current date and time. Debug (@ON | @OFF) Turns Debug mode on or off. Delay (seconds) Pauses menu execution. Drop (var [, var]...) Deletes variables to recover their memory. EndSession ( ) Ends the current Windows session. Environment (env-variable) Returns the value of a DOS environment variable. ErrorMode (mode) Sets what happens in the event of an error. Execute statement Directly executes a Command Post statement. Exit Exits the current menuitem's operation. IniRead (section, keyname, default) Reads a string from the win.ini file. IniWrite (section, keyname, string) Writes a string to the win.ini file. IsDefined (variable) Determines if a variable is currently defined. IsRunning ( ) Determines if another copy of Command Post is running. 44 COMMAND POST MENU LANGUAGE LastError ( ) Returns the last error encountered. #NextFile filename Links a second Command Post menu file onto the one invoked. OtherDir ( ) Finds the directory of the "other" running Command Post. OtherUpdate ( ) Updates other running Command Post's display. SetDisplay (detail-level, sort-by, masks) Changes how the Command Post File Manager lists files. Terminate (expression, title, message) Conditionally ends a menu operation, with a notice if desired. Version ( ) Returns the version of Command Post currently running. WinVersion (which-level) Gets the version of Windows that is currently running. Yield Pauses menu processing so other applications can process some messages. 45 CPML FUNCTION REFERENCE CPML FUNCTION REFERENCE Introduction CPML gives you almost a hundred functions and control statements, which we describe in detail in this section. We use a shorthand notation to indicate the syntax of the functions. Function names and other actual characters you type are in boldface. Optional parameters are enclosed in square brackets "[ ]". When a function takes a variable number of parameters, the variable parts will be followed by ellipses ("..."). Take for example string concatenation: StrCat (string[, string]...) This says that the StrCat function takes at least one string parameter. Optionally you can specify more strings to concatenate. If you do, you must separate the strings with commas. For each function and control statement, we show you the Syntax, describe the Parameters (if any), the value it Returns (if any), a description of the function, any nonfatal Errors specific to the function, Example code (shown in courier type), and related functions you may want to See Also. 47 CPML FUNCTION REFERENCE Abs Returns the magnitude of the argument. Syntax: Abs (integer) Parameters: "integer" = integer whose absolute value is desired. Returns: (integer) absolute value of argument. Example: DY=abs(y1-y2) Message("Years","There are %DY% years 'twixt %y1% and %y2%") See Also: Average, Max, Min 48 CPML FUNCTION REFERENCE AskLine Prompts the user for one line of input. Syntax: AskLine (title, prompt, default) Parameters: "title" = title of the dialog box. "prompt" = question to be put to the user. "default" = default answer. Returns: (string) user response. Use this command to query the user for a line of data. The entire user response will be returned if the user presses the OK button or the Enter key. If they press Cancel, the menu item processing is cancelled. Example: Name=AskLine("Dessert","Please enter your name","") Dsrt=AskLine("Dessert","Favorite dessert?","Ice Cream") message(strcat(Name,"'s dessert is "),Dsrt) produces: 49 CPML FUNCTION REFERENCE ...and then, if Jenny types "JELL-O" and presses OK: See Also: AskYesNo, Display, ItemSelect, Message, Pause, TextBox 50 CPML FUNCTION REFERENCE AskYesNo Prompts the user for a YES or NO answer. Syntax: AskYesNo (title, question) Parameters "title" = title of the question box. "question" =question to be put to the user. Returns: (integer) @YES or @NO, depending on the button pressed. This command displays a message box with three pushbuttons - Yes, No, and Cancel. If the user presses Cancel, the current menu item is ended so there is no return value. Example: q=AskYesNo('Testing','Please press "YES"') Terminate(q==@YES,"","") Display(3,'ERROR',"I said press 'YES'") produces: ...and if the user presses No: See Also: AskLine, Display, ItemSelect, Message, Pause, TextBox 51 CPML FUNCTION REFERENCE Average Provides the integer average of the arguments. Syntax: Average (integer [, integer]...) Parameters: "integer" = integers to get the average of. Returns: (integer) average of the arguments. Use this command to compute the average of a series of numbers. This function returns an integer value, so there can be some rounding error involved. Errors: 2060 "Average function syntax error" Example: Ave=Average(1,2,3,4,5,6,7,8,9,10,11,12,13) Message("The average is",Ave) See Also: Abs, Max, Min 52 CPML FUNCTION REFERENCE Beep Beeps once. Syntax: Beep Use this command to produce a short beep, generally to alert the user to an error situation. Example: Beep Pause ("WARNING!!!", "You are about to destroy data!") 53 CPML FUNCTION REFERENCE Char2Num Converts the first character of a string to its numeric equivalent. Syntax: Char2Num (string) Parameters: "string" = any text string. Only the first character will be converted. Returns: (integer) ANSI character code. This function returns the 8-bit ANSI code corresponding to the first character of the string parameter. Note: For the commonly-used characters (with codes below 128), ANSI and ASCII characters are identical. Example: ; Show the hex equivalent of entered character &Programming &ANSI Codes InpChar = AskLine("ANSI Equivalents", "Char:", "") Ansi = strsub(InpChar,1,1) AnsiEquiv = Char2Num(InpChar) Message("ANSI Codes","%Ansi% => %AnsiEquiv%") See Also: Num2Char 54 CPML FUNCTION REFERENCE ClipAppend Appends a string to the Clipboard. Syntax: ClipAppend (string) Parameters: "string" = text string to add to Clipboard. Returns: (integer) @TRUE if string was appended; @FALSE if Clipboard ran out of memory. Use this command to append a string to the Windows Clipboard. The Clipboard must either contain text data or be empty for this command to succeed. Example: ; The code below will append 2 copies of the Clipboard con- ; tents back to the Clipboard, resulting in 3 copies of the ; original contents with a CR/LF between each copy. a=clipget() crlf=strcat(num2char(13),num2char(10)) clipappend(crlf) clipappend(a) clipappend(crlf) clipappend(a) See Also: ClipGet, ClipPut 55 CPML FUNCTION REFERENCE ClipGet Returns the contents of the Clipboard. Syntax: ClipGet ( ) Returns: (string) clipboard contents. Use this command to copy text from the Windows Clipboard into a string variable. Note: If the Clipboard contains an excessively large string a (fatal) out of memory error may occur. Example: ; The code below will convert Clipboard contents to uppercase: clipput(strupper(clipget())) a=clipget() message("UPPERCASE Clipboard Contents",a) See Also: ClipAppend, ClipPut 56 CPML FUNCTION REFERENCE ClipPut Copies a string to the clipboard. Syntax: ClipPut (string) Parameters: "string" = any text string. Returns: (integer) @TRUE if string was copied; @FALSE if clipboard ran out of memory. Use this command to copy a string to the Windows Clipboard. The previous Clipboard contents will be lost. Example: ; The code below will convert Clipboard contents to lowercase: clipput(strlower(clipget())) a = clipget () message("lowercase Clipboard Contents",a) See Also: ClipAppend, ClipGet 57 CPML FUNCTION REFERENCE CurrentFile Returns the selected filename. Syntax: CurrentFile ( ) Returns: (string) currently-selected file's name. When Command Post displays the files in the current directory, one of them is always selected. It's the one with the dotted-line box around it. This is different than a "highlighted" file. When a file is highlighted, it shows up in inverse video (usually white-on-black). To find the filenames that are highlighted, see FileItemize. Example: ; Ask which program to run (default = current file): TheFile = AskLine ("Run It", "Program:", CurrentFile()) Run (TheFile, "") See Also: FileItemize, DirGet, DirItemize 58 CPML FUNCTION REFERENCE DateTime Provides the current Date and time. Syntax: DateTime ( ) Returns: (string) Today's Date and time This function will return the current date and time in a pre- formatted string. The format it is returned in depends on how it is set up in the international section of the WIN.INI file: ddd mm:dd:yy hh:mm:ss XX ddd dd:mm:yy hh:mm:ss XX ddd yy:mm:dd hh:mm:ss XX Where ddd is day of the week (e.g. Mon) mm is the month (e.g. 10) dd is the day of the month (e.g. 23) yy is the year (e.g. 90) hh is the hours mm is the minutes ss is the seconds XX is the Day/Night code (e.g. AM or PM) Note: Windows 3.0 provides even more formatting options than this. The WIN.INI file will be examined to determine which format to use. You can adjust the WIN.INI file via the International section of the Control Panel if the format isn't what you prefer. Example: ; assuming the current standard is U.S. ; (i.e. day dd/mm/yy hh:mm:ss AM): Message("Current Date & Time",DateTime()) would produce: 59 CPML FUNCTION REFERENCE Debug Controls the debug mode. Syntax: Debug (mode) Parameters: "mode" = @ON | @OFF Returns: (integer) Previous Debug mode Use this command to turn the debug mode on or off. The default is @OFF. When Debug mode is on, Command Post will display the command just executed, its result (if any), any error conditions, and the next command to execute. The commands are displayed in a special dialog box. As you can see in the Example section following, the dialog box gives the user four options: Next, Run, Cancel and Show Var. Next executes the next statement and remains in debug mode. Run exits debug mode and runs the rest of the program normally. Cancel terminates the current menu item. Show Var displays the contents of a variable whose name the user entered in the edit box. Example: ; Debug example debug(@on) a = 6 q = askyesno("Testing Debug Mode", "Is the Pope Catholic") debug(@off) b = a + 4 produces: 60 CPML FUNCTION REFERENCE ...then, if the user presses Next: ...and if the user presses Yes: ...etc. (If the user had pressed No it would have said "VALUE=>0".) See Also: ErrorMode, LastError 61 CPML FUNCTION REFERENCE Delay Pauses execution a specified amount of time. Syntax: Delay (seconds) Parameters: "seconds" = number of seconds to delay (2 - 15) Returns: (integer) always @TRUE Seconds must be between 2 and 15. Smaller or larger numbers will be adjusted accordingly. Example: Message("Wait","About 15 seconds") Delay(15) Message("Hi","I'm Baaaaaaack") See Also: Yield 62 CPML FUNCTION REFERENCE DirChange Changes the current directory. Can also log a new drive. Syntax: DirChange ([d:]path) Parameters: "[d:]" = an optional disk drive to log onto. "path" = the desired path. Returns: (integer) @TRUE if directory was changed; @FALSE if the path could not be found. Use this command to change the current working directory to another directory, either on the same or a different disk drive. Errors: 1031 "DirChange: Dir not found/changed" Example: DirChange("c:\") textbox("This is your CONFIG.SYS file", "config.sys") See Also: DirGet, DirHome, LogDisk 63 CPML FUNCTION REFERENCE DirGet Gets the Current Working Directory. Syntax: DirGet ( ) Returns: (string) = Current Working Directory. Use this command to determine which directory we are currently in. It's especially useful when changing drives or directories temporarily. Example: ; Get, then restore current working directory OrigDir=DirGet() DirChange("c:\") FileCopy("config.sys","%OrigDir%xxxtemp.xyz", @FALSE) DirChange(OrigDir) See Also: DirHome, OtherDir 64 CPML FUNCTION REFERENCE DirHome Returns directory containing the Command Post EXE file. Syntax: DirHome ( ) Returns: (string) pathname of the home directory. Use this command to determine the location of CMDPOST.EXE. Example: a=DirHome() Message("Command Post Executable is in ",a) See Also: DirGet, OtherDir 65 CPML FUNCTION REFERENCE DirItemize Returns a space-delimited list of the highlighted directories. Syntax: DirItemize (dir-list) Parameters: "dir-list" =a string containing zero or more subdirectory names, which may be wildcarded. Returns: (string) list of directories. This function compiles a list of subdirectories and separates the names with spaces. Which directory names are itemized depends on the "dir-list" parameter: If it is an empty string, all subdirectories highlighted in the Command Post file manager display are included. If there are any directory names or wildcards in the string, all subdirectories matching the pathnames are included regardless of which ones are highlighted. This is especially useful in conjunction with the ItemSelect function, which enables the user to choose an item from such a space-delimited list. Example: ;Verify directory selection: a=DirItemize("") ItemSelect("Directories", a, " ") See Also: FileItemize, WinItemize, ItemSelect 66 CPML FUNCTION REFERENCE DirMake Creates a new directory. Syntax: DirMake ([d:]path) Parameters: "[d:]" = the desired disk drive. "path" = the path to create. Returns: (integer) @TRUE if the directory was successfully created; @FALSE if it wasn't. Use this command to create a new directory. Errors: 1029 "DirMake: Dir not created" Example: DirMake("c:\XXXSTUFF") See Also: DirRemove 67 CPML FUNCTION REFERENCE DirRemove Removes a directory. Syntax: DirRemove (dir-list) Parameters: "dir-list" =a space-delimited list of directory pathnames. Returns: (integer) @TRUE if the directory was successfully removed; @FALSE if it wasn't. Use this command to delete directories. You can delete one or more at a time by separating directory names with spaces. You cannot, however, use wildcards. Errors: 1030 "DirRemove: Dir not removed" Example: DirRemove("c:\XXXSTUFF") DirRemove("tempdir1 tempdir2 tempdir3") See Also: DirMake 68 CPML FUNCTION REFERENCE DiskFree Finds the total space available on a group of drives. Syntax: DiskFree (drive-list) Parameters: "drive-list" = at least one drive letter, separated by spaces. Returns: (integer) the number of bytes available on all the specified drives. This function takes a string consisting of drive letters, separated by spaces. Only the first character of each non-blank group of characters is used to determine the drives, so you can use just the drive letters, or add a colon (":"), or add a backslash ("\"), or even a whole pathname and still get a perfectly valid result. Example: Size = DiskFree ("c d") Message ("Space Available on C: & D:", Size) See Also: FileSize 69 CPML FUNCTION REFERENCE Display Displays a message to the user for a specified time. Syntax: Display (seconds, title, text) Parameters: "seconds" = integer seconds to display the message (1-15). "title" = Title of the window to be displayed. "text" = Text of the window to be displayed. Returns: (integer) always @TRUE. Use this command to display a message for a few seconds, and then continue with processing without user input. The display box may be prematurely canceled by the user by clicking it with a mouse, or hitting any character. Example: name=askline("Desserts", "Please enter your name", "") dsrt=askline("Desserts", "Favorite dessert?", "Ice Cream") display(3,"%name%'s Dessert", dsrt) ...If Jennifer likes pudding, the display statement produces: See Also: Pause, Message, Terminate 70 CPML FUNCTION REFERENCE Drop Removes variables from memory. Syntax: Drop (var, [var]...) Parameters: var = variable names to remove. Returns: (integer) @TRUE. This function removes variables from the language processor's variable list, and recovers the memory associated with the variable (and possibly related string storage). Example: A="A variable" B="Another one" Drop(A,B) ; This removes A and B from memory 71 CPML FUNCTION REFERENCE EndSession Ends the Windows session. Syntax: EndSession ( ) Use this command to end the Windows session. This command is equivalent to closing the MS-DOS Executive window in Windows v2.x, or the Program Manager window in Windows v3.0. Example: &Utilities E&xit Windows Sure = AskYesNo ("End Session", "You SURE you want to exit Windows?") Terminate (Sure==@No, "", "Exit Windows cancelled") EndSession () See Also: Exit, Terminate, WinClose, WinCloseNot 72 CPML FUNCTION REFERENCE Environment Gets a DOS environment variable. Syntax: Environment (env-variable) Parameters: "env-variable" = any defined environment variable. Returns: (string) environment variable contents. Use this command to query the DOS environment. Example: &MsDos Utilities Display &Path ;Display the PATH for this DOS session... CurrPath=Environment("PATH") Message ("Current DOS Path", CurrPath) See Also: IniRead, Version, WinVersion 73 CPML FUNCTION REFERENCE ErrorMode Specifies how to handle errors. Syntax: ErrorMode (mode) Parameters: "mode" = @CANCEL, @NOTIFY, or @OFF. Returns: (integer) previous error setting. Use this command to control the effects of runtime errors. The default is @CANCEL, meaning the execution of the menu item will be cancelled for any error. @CANCEL: All runtime errors will cause execution to be cancelled. The user will be notified which error occurred. @NOTIFY: All runtime errors will be reported to the user, and they can choose to continue if it isn't fatal. @OFF: Minor runtime errors will be suppressed. Moderate and fatal errors will be reported to the user. User has the option of continuing if the error is not fatal. In general we suggest the normal state of the program should be ErrorMode(@CANCEL), especially if you are writing a menu for others to use. You can always suppress errors you expect will occur and then re-enable ErrorMode (@CANCEL). Example: ; Delete xxxtest.xyz. ; If file doesn't exist, continue execution; don't stop: PrevErrMode=ErrorMode(@off) FileDelete("c:\xxxtest.xyz") ErrorMode(PrevErrMode) See Also: Debug, LastError 74 CPML FUNCTION REFERENCE Execute Executes a statement in a protected environment. Any errors encountered are recoverable. Syntax: Execute statement Parameters: "statement" = is (hopefully) an executable statement. Use this command to execute computed or user-entered statements. Due to the built-in error recovery associated with the Execute statement, it is ideal for interactive execution of user-entered commands. Note the Execute statement doesn't operate on a string per se, but rather on a direct statement. If you want to put a code segment into a string variable you must use the substitution feature of the language, as in the example below. Example: CPMLCmd="" ;in autoexec section in beginning . . . &System CP Menu Language Interactive CPMLCmd=AskLine("CPML Interactive","Command:",CPMLCmd) execute %CPMLCmd% 75 CPML FUNCTION REFERENCE Exit Terminates the menu item being interpreted. Syntax: Exit Use this command to prematurely exit a menu process. An exit is implied at the end of each menu item. Example: a = 100 message("The value of a is",a) exit See Also: Pause 76 CPML FUNCTION REFERENCE FileCopy Copies files. Syntax: FileCopy (source-list, destination, warning) Parameters: "source-list" = a string containing one or more filenames, which may be wildcarded. "destination" = target file name. "warning" = @TRUE if you want a warning before overwriting existing files; @FALSE if no warning desired. Returns: (integer) @TRUE if all files were copied successfully; @FALSE if at least one file wasn't copied. Use this command to copy an individual file, a group of files using wildcards, or several groups of files by separating the names with spaces. You can also copy files to any COM or LPT device. "Source-list" may contain * and ? wildcards. "Destination" may contain the * wildcard only. Errors: 1006 "File Copy/Move: No matching files found" 2002 "File Copy/Move: 'From' file illegal" 2003 "File Copy/Move: 'To' file illegal" 2004 "File Copy/Move: Cannot copy/move wildcards into fixed root" 2005 "File Copy/Move: Cannot copy/move wildcards into fixed extension" 3118 "FileCopyMove: Destination file same as source" Examples: FileCopy("c:\config.sys","d:", @FALSE) FileCopy("c:\*.sys","d:devices\*.sys", @TRUE) FileCopy("c:\config.sys","LPT1:", @FALSE) See Also: FileDelete, FileExist, FileLocate, FileMove, FileRename 77 CPML FUNCTION REFERENCE FileDelete Deletes files. Syntax: FileDelete (file-list) Parameters: "file-list" = a string containing one or more filenames, which may be wildcarded. Returns: (integer) @TRUE if all the files were deleted; @FALSE if a file didn't exist or is marked with the READ-ONLY attribute. Use this command to delete an individual file, a group of files using wildcards, or several groups of files by separating the names with spaces. Errors: 1017 "File Delete: No matching files found" 1018 "File Delete: Delete Failed" 2016 "File Delete: File name illegal" Example: WasDeleted = FileDelete ("BadFile") See Also: FileExist, FileLocate, FileMove, FileRename 78 CPML FUNCTION REFERENCE FileExist Tests for the existence of files. Syntax: FileExist (filename) Parameters: "filename" =either a fully qualified filename with drive and path, or just a filename and extension. Returns: (integer) @YES if the file exists; @NO if it doesn't or if the pathname is invalid. This statement is used to test whether or not a specified file exists. If a fully qualified file name is used only the specified drive and directory will be checked for the desired file. If only the root and extension are specified, then all the directories in the DOS PATH statement will be searched for the desired file. Example: ; check for file in current directory Fex=FileExist(strcat(DirGet(),"myfile.txt")) Tex=substr("NOT",1,strlen("NOT")*Fex) Message("MyFile.Txt"," Is %Tex%in the current directory") ; check for file in someplace along path Fex=FileExist("myfile.txt") Tex=substr("NOT",1,strlen("NOT")*Fex) Message("MyFile.Txt"," Is %Tex% in the DOS path") See Also: FileLocate 79 CPML FUNCTION REFERENCE FileItemize Returns a space-delimited list of files. Syntax: FileItemize (file-list) Parameters: "file-list" = a string containing zero or more filenames, which may be wildcarded. Returns: (string) space-delimited list of files. This function compiles a list of filenames and separates the names with spaces. Which filenames are itemized depends on the "file-list" parameter: If it is an empty string, all filenames highlighted in the Command Post file manager display are included. If there are any filenames or wildcards in the string, all files matching the filenames are included regardless of which ones are highlighted. This is especially useful in conjunction with the ItemSelect function, which enables the user to choose an item from such a space-delimited list. Examples: &Edit INI files ;Get which .INI file to edit (meaningful in Win 3.0 only): IFiles= FileItemize("c:\windows\*.ini") IFile = ItemSelect(".INI Files",IFiles, " ") RunZoom ("Notepad", IFile) Drop (IFiles, IFile) See Also: DirItemize, WinItemize, ItemSelect 80 CPML FUNCTION REFERENCE FileLocate Finds file in current directory or along the DOS PATH. Syntax: FileLocate (filename) Parameters: "filename" =root name, ".", and an extension. Returns: (string) fully qualified path name. This function is used to obtain the fully qualified path name of a file. The current directory is checked first, and if the file is not found the DOS path is searched. This function returns the first occurrence of the file. Example: Edit &WIN.INI winini=FileLocate("win.ini") Terminate(winini=="","???","WIN.INI not found") Run("notepad.exe",winini) Exit See Also: FileExist 81 CPML FUNCTION REFERENCE FileMove Moves files. Syntax: FileMove (source-list, destination, warning) Parameters: "source-list" = one or more filenames separated by spaces. "destination" = target filename. "warning" = @TRUE if you want a warning before overwriting existing files; @FALSE if no warning desired. Returns: (integer) @TRUE if the file was moved; @FALSE if the source file was not found or had the READ-ONLY attribute, or the target filename is invalid. Use this command to move an individual file, a group of files using wildcards, or several groups of files by separating the names with spaces. You can also move files to another drive, or to any COM or LPT device. "Source-list" may contain * and ? wildcards. "Destination" may contain the * wildcard only. Errors: 1006 "File Copy/Move: No matching files found" 2002 "File Copy/Move: 'From' file illegal" 2003 "File Copy/Move: 'To' file illegal" 2004 "File Copy/Move: Cannot copy/move wildcards into fixed root" 2005 "File Copy/Move: Cannot copy/move wildcards into fixed extension" 2007 "File Move: Unable to rename source file" 2015 "File Move: Unable to remove source file" Example: FileMove("c:\config.sys","d:", @FALSE) FileMove("c:\*.sys","d:*.sys", @TRUE) See Also: FileCopy, FileDelete, FileExist, FileLocate, FileRename 82 CPML FUNCTION REFERENCE FileRename Renames files. Syntax: FileRename (source-list, destination) Parameters: "source-list" = one or more filenames separated by spaces. "destination" = target filename. Returns: (integer) @TRUE if the file was renamed; @FALSE if the source file was not found or had the READ-ONLY attribute, or the target filename is invalid. Use this command to rename an individual file, a group of files using wildcards, or several groups of files by separating the names with spaces. Note: Unlike FileMove, you cannot make a file change its resident disk drive with FileRename. "Source-list" may contain * and ? wildcards. "Destination" may contain the * wildcard only. Errors: 1024 "File Rename: No matching files found" 1025 "File Rename: Rename failed" 2019 "File Rename: 'From' file illegal" 2020 "File Rename: 'To' file illegal" 2021 "File Rename: Attempt to rename across drive boundary. - Use MOVE instead." 2022 "File Rename: Cannot rename wildcards into a fixed filename root" 2023 "File Rename: Cannot rename wildcards into a fixed filename extension" Example: FileRename("c:\config.sys","config.old") FileRename("c:\*.txt","*.bak") See Also: FileCopy, FileExist, FileLocate, FileMove 83 CPML FUNCTION REFERENCE FileSize Finds the total size of a group of files. Syntax: FileSize (file-list) Parameters: "file-list" = zero or more filenames, separated by spaces. Returns: (integer) total bytes taken up by the specified files. This function returns the total size of the specified files. Note it doesn't handle wildcarded filenames. You can, however, use FileItemize on a wildcarded filename and use the resulting string with as a FileSize parameter. Errors: 3112 "FileSize: File Not Found" Example: Size = FileSize (FileItemize("")) Message ("Size of Highlighted Files", Size) See Also: DiskFree 84 CPML FUNCTION REFERENCE IniRead Reads data from the WIN.INI file. Syntax: IniRead (section, keyname, default) Parameters: "section" = the major heading to read the data from. "keyname = the name of the item to read. "default" = string to return if the desired item is not found. Returns: (string) data from WIN.INI file. This command allows a program to read data from the WIN.INI file. The WIN.INI file has the form: [section] keyname=settings Most of the entries in WIN.INI are set from the Windows Control Panel program, but individual applications can also use it to store option settings in their own sections. Example: ;Find the default output device: a=IniRead("windows","device","No Default") Message("Default Output Device",a) See Also: Environment, IniWrite 85 CPML FUNCTION REFERENCE IniWrite Writes data to the WIN.INI file. Syntax: IniWrite (section, keyname, data) Parameters: "section" = major heading to write the data to. "keyname = name of the data item to write. "data" = string to write to the WIN.INI file. Returns: (integer) always @TRUE. This command allows a program to write data to the WIN.INI file. The "section" is added to the file if it doesn't already exist. Example: &WIN.INI Stuff Modify &LOAD= line ;Change the list of pgms to load upon Windows startup: LoadProgs = IniRead("windows","load","") NewProgs=AskLine("Add Pgm To LOAD= Line", "Add:", LoadProgs) IniWrite("windows","load",NewProgs) See Also: IniRead 86 CPML FUNCTION REFERENCE IsDefined Determines if a variable name is currently defined. Syntax: IsDefined (var) Parameters: "var" = a variable name. Returns: (integer) @YES if the variable is currently defined; @NO if it was never defined or has been dropped. A variable is defined the first time it appears at the left of an equal sign in a statement. It stays defined until it is explicitly Dropped. Example: Def = IsDefined (ThisVar) Terminate (Def==@FALSE, "ERROR!", "Variable not defined") See Also: Drop 87 CPML FUNCTION REFERENCE IsMenuChecked Determines if a menuitem has a checkmark next to it. Syntax: IsMenuChecked (menuname) Parameters: "menuname" =name of the menu item to test. Returns: (integer) @YES if the menuitem has a checkmark; @NO if it doesn't. You can place a checkmark next to a menu item with the MenuChange command, to indicate an option has been enabled. This function lets you determine if the menu item has already been checked or not. Example: ;Assume we've defined a "Misc./Prompt Often" menuitem... Prompt = IsMenuChecked ("MiscPromptOften") IfPrompt = substr(";",1,(Prompt==@FALSE)) execute %IfPrompt% Confirm = AskYesNo ("???", "Do you REALLY want to do this?") execute %IfPrompt% Terminate (Confirm!=@YES, "", "") ;some risky operation the user has just confirmed they want ;to carry out... See Also: IsMenuEnabled, MenuChange 88 CPML FUNCTION REFERENCE IsMenuEnabled Determines if a menuitem has been enabled. Syntax: IsMenuEnabled (menuname) Parameters: "menuname" =name of the menu item to test. Returns: (integer) @YES if the menuitem is enabled; @NO if it is disabled & grayed. You can disable a menu item with the MenuChange command if you want to prevent the user from choosing it. It shows up on the screen as a grayed item. IsMenuEnabled lets you determine if the menu item is currently enabled or not. Example: ;Allow editing of autoexec.bat file only if choice enabled Terminate (!IsMenuEnabled("UtilitiesEditBatFile"), "", "") Run ("Notepad.exe", "c:\autoexec.bat") See Also: IsMenuChecked, MenuChange 89 CPML FUNCTION REFERENCE IsNumber Determines whether a variable contains a valid number. Syntax: IsNumber (string) Parameters: "string" = string to test to see if it represents a valid number. Returns: (integer) @YES if it contains a valid number; @NO if it doesn't. This function determines if a string variable contains a valid integer. Useful for checking user input prior to using it in computations. Example: a = AskLine("ISNUMBER","Enter a number","0") Terminate(!IsNumber(a),"", "You didn't enter a number") See Also: Abs, Char2Num 90 CPML FUNCTION REFERENCE IsRunning Determines if another copy of Command Post is currently running. Syntax: IsRunning ( ) Returns: (integer) @YES if another copy of Command Post is running; @NO if this is the only one. There is no artificial restraint on the number of copies of Command Post you may run at once. Example: a=!(IsRunning()) Is = strsub("not ", 1, 4*a) Message ("", "Another Command Post is %Is% running.") Drop (a, Is) See Also: OtherDir, OtherUpdate 91 CPML FUNCTION REFERENCE ItemSelect Allows the user to choose an item from a listbox. Syntax: ItemSelect (title, list, delimiter) Parameters: "title" = the title of dialog box to display. "list" = a string containing a list of items to choose from. "delimiter" = a string containing the character to act as delimiter between items in the list. Returns: (string) the selected item. This function displays a dialog box with a listbox inside. This listbox is filled with a list of items taken from a string you provide to the function. Each item in the string must be separated ("delimited") by a character, which you also pass to the function. The user selects one of the items by either doubleclicking on it, or single-clicking and pressing OK. The item is returned as a string. If you create the list with the FileItemize or DirItemize functions you will be using a space-delimited list. WinItemize, however, creates a tab-delimited list of window titles since titles can have embedded blanks. Example: &Graphics &PC Paintbrush Files = FileItemize("*.bmp") TheFile = ItemSelect("Bitmap Files",Files, " ") Run("pbrush.exe", TheFile) would produce (depending on what's in the current directory): 92 CPML FUNCTION REFERENCE See Also: AskYesNo, Display, DirItemize, FileItemize, WinItemize, Message, Pause, TextBox 93 CPML FUNCTION REFERENCE LastError Returns the most-recent error encountered during the current menu item. Syntax: LastError ( ) Returns: (integer) most-recent CPML error code encountered. CPML errors are numbered according to their severity. "Minor" errors go from 1000 through 1999. Moderate errors are 2000 through 2999. Fatal errors are numbered 3000 to 3999. Depending on which error mode is active when an error occurs, you may not get a chance to check the error code. See ErrorMode for a discussion of default error handling. Don't bother checking for "fatal" error codes. When a fatal error occurs, the menu item is cancelled before the next CPML statement gets to execute (regardless of which error mode is active). Calling LastError itself resets the last error indicator back to zero. A full listing of possible errors you can encounter in processing a menu item is in Appendix E - Errors. Example: ErrorMode (@OFF) FileCopy ("Data.dat", "c:\backups", @FALSE) ErrorMode (@CANCEL) Terminate (LastError()==1006,"Error","Please call Tech Support at 555-9999.") See Also: Debug, ErrorMode 94 CPML FUNCTION REFERENCE LogDisk Logs (activates) a disk drive. Syntax: LogDisk (drive-letter) Parameters: "drive-letter" = is the disk drive to log into. Returns: (integer) @TRUE if the current drive was changed; @FALSE if the drive doesn't exist. Use this command to change the logged disk drive. This command produces the same effect as if you typed the drive name from the DOS command prompt. Errors: 1028 "LogDisk: Requested drive not online" Example: logdisk("c:") See Also: DirChange 95 CPML FUNCTION REFERENCE Max Returns largest number in a list of numbers. Syntax: Max (integer [, integer]...) Parameters: "integer" = number. Returns: (integer) largest parameter. Use this function to determine the largest of a set of numbers. Example: a=Max(5, -37, 125, 34, 2345, -32767) Message("Largest number is",a) See Also: Abs, Average, Min 96 CPML FUNCTION REFERENCE MenuChange Checks, unchecks, enables, or disables a menu item. Syntax: MenuChange (menuname, flags) Parameters: "menuname" =menu item whose status you wish to change. "flags" = @CHECK, @UNCHECK, @ENABLE, or @DISABLE. Returns: (integer) always @TRUE. There are currently two ways you can modify a menu item: You can check and uncheck the item to imply that it corresponds to an option that can be turned on or off. You can temporarily disable the item (it shows up as gray) and later re-enable it. The two sets of flags (@Check/@UnCheck and @Enable/@Disable) can be combined in one function call by using the | (or) operator. Example: MenuChange (FilePrint, @Disable) MenuChange (WPWrite, @Enable|@Check) See Also: IsMenuChecked, IsMenuEnabled 97 CPML FUNCTION REFERENCE Message Displays a message to the user. Syntax: Message (title, text) Parameters: "title" = title of the message box. "text" = text to display in the message box. Returns: (integer) always @TRUE. Use this command to display a message to the user. The user must respond by selecting the OK button before processing will continue. Example: Message("GUESSIT","Pick a number between one and 100") Message("GUESSIT","Multiply your number by 2") Message("GUESSIT","Add 34") Message("GUESSIT","Divide by 2") Message("GUESSIT","Subtract your original number") Message("GUESSIT","Your answer is 17") produces: See Also: Display, Pause, Terminate 98 CPML FUNCTION REFERENCE Min Returns lowest number in a list of numbers. Syntax: Min (integer [, integer]...) Parameters: "integer" = any integer number. Returns: (integer) lowest parameter. Use this function to determine the lowest of a set of integers. Example: a=Min( 5, -37, 125, 34, 2345, -32767) Message("Smallest number is",a) See Also: Abs, Average, Max 99 CPML FUNCTION REFERENCE #NextFile Syntax: #NextFile filename The #NextFile directive tells the CPML interpreter to append another.CPM file to the current one before building the menus. In this manner you can build a common menu for a group of users, for example, and include a #NextFile directive to allow each user to customize part of their menus to suit their individual needs. The default menu file CMDPOST.CPM calls the default user menu CMDUSER.CPM in just this way. #NextFile should appear only once in a menu file, as CPML only acts upon the first one it sees. Also, you can only link one user menu in this manner. Example: ;(beginning of CMDPOST.CPM file) ;changed this directive to point to my own menu file ;instead of the default "cmduser.cpm": #NextFile MyOwn.cpm . . . 100 CPML FUNCTION REFERENCE Num2Char Converts a number to its character equivalent. Syntax: Num2Char (integer) Parameters: "number" = any number from 0 to 255. Returns: (string) one-byte string containing the character the number represents. Use this command to convert a number to its ASCII equivalent. Example: ; Build a variable containing a CRLF combo crlf=strcat(num2char(13),num2char(10)) message("NUM2CHAR",strcat("line1",crlf,"line2")) See Also: Char2Num 101 CPML FUNCTION REFERENCE OtherDir Finds the directory where the other copy of Command Post is running, if any. Syntax: OtherDir ( ) Parameters: "string" = pathname to "other" directory. Returns: (string) the directory of the second-most recently used Command Post window. The current window is considered the most recently used directory. Use this command to determine directory of the other Command Post window. Useful in setting up copy and move operations between two Command Post copies. Example: a=DirGet() b=OtherDir() Message("Directory of this CmdPost window is",a) Message("Directory of the other CmdPost window is",b) See Also: DirGet, DirHome, OtherUpdate 102 CPML FUNCTION REFERENCE OtherUpdate Updates another Command Post directory display. Syntax: OtherUpdate ( ) Returns: (integer) @TRUE if another copy of Command Post was found to update; @FALSE if this is the only copy running. This command updates the File Manager display of the next-most recently invoked copy of Command Post. This is useful if your menu item changes a directory; i.e. if a file or directory is created, moved, renamed, or deleted. OtherUpdate helps ensure the other Command Post display immediately reflects the change the user caused from this copy. Example: FileCopy ("MyFile.txt", OtherDir(), @FALSE) OtherUpdate () See Also: OtherDir, SetDisplay 103 CPML FUNCTION REFERENCE Pause Provides a message to user. User may cancel processing. Syntax: Pause (title, text) Parameters: "title" = title of pause box. "text" = text of the message to be displayed. Returns: (integer) always @TRUE. This command displays a message to the user with an exclamation point icon. The user may respond by selecting the OK button, or they may cancel the processing by selecting CANCEL. The Pause command is similar to the Message command except for the addition of the CANCEL button and icon. Example: Pause("Change Disks","Insert new disk into Drive A:") produces: See Also: Display, Message, Terminate 104 CPML FUNCTION REFERENCE Random Computes a pseudo-random number. Syntax: Random (max) Parameters: "max" = largest desired number. Returns: (integer) unpredictable positive number. This function will return a random integer between 0 and "max". Example: a = Random(79) Message("Random number between 0 and 79",a) 105 CPML FUNCTION REFERENCE Run Runs a program as a normal window. Syntax: Run (program-name, parameters) Parameters: "program-name" =the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. "parameters" = optional parameters as required by the applica- tion. Returns: (integer) @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application. If the drive and path are not part of the program name, the current directory will be examined first and then the DOS path will be searched to find the desired executable file. If the "program-name" doesn't have an extension of .EXE, .COM, .PIF, or .BAT, it will be run in accordance with whatever is in the [extensions] section of the WIN.INI file. When this happens, any "parameters" you specified are ignored. Examples: Run("Notepad.exe","abc.txt") Run("clock.exe","") Run("paint.exe","pict.msp") See Also: RunHide, RunIcon, RunZoom, WinClose, WinWaitClose 106 CPML FUNCTION REFERENCE RunHide Runs a program as a hidden window. Syntax: RunHide (program-name, parameters) Parameters: "program-name" =the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. "parameters" = optional parameters as required by the application. Returns: (integer) @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as a hidden window. If the drive and path are not part of the program name, the current directory will be examined first and then the DOS path will be searched to find the desired executable file. If the "program-name" doesn't have an extension of .EXE, .COM, .PIF, or .BAT, it will be run in accordance with whatever is in the [extensions] section of the WIN.INI file. When this happens, any "parameters" you specified are ignored. Note: When this command launches an application it informs it that you want it to run as a hidden window. Whether or not the application honors your wish is beyond RunHide's control. Examples: RunHide("Notepad.exe","abc.txt") RunHide("clock.exe","") RunHide("paint.exe","pict.msp") See Also: Run, RunIcon, RunZoom, WinHide, WinClose, WinWaitClose 107 CPML FUNCTION REFERENCE RunIcon Runs a program as an iconic (minimized) window. Syntax: RunIcon (program-name, parameters) Parameters: "program-name" =the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. "parameters" = optional parameters as required by the application. Returns: (integer) @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as an icon. If the drive and path are not part of the program name, the current directory will be examined first and then the DOS path will be searched to find the desired executable file. If the "program-name" doesn't have an extension of .EXE, .COM, .PIF, or .BAT, it will be run in accordance with whatever is in the [extensions] section of the WIN.INI file. When this happens, any "parameters" you specified are ignored. Note: When this command launches an application it merely informs it that you want it to begin as an icon. Whether or not the application honors your wish is beyond RunIcon's control. Examples: RunIcon("Notepad.exe","abc.txt") RunIcon("clock.exe","") RunIcon("paint.exe","pict.msp") See Also: Run, RunHide, RunZoom, WinIconize, WinClose, WinWaitClose 108 CPML FUNCTION REFERENCE RunZoom Runs a program as a full-screen (maximized) window. Syntax: RunZoom (program-name, parameters) Parameters: "program-name" =the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. "parameters" = optional parameters as required by the application. Returns: (integer) @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as a full-screen window. If the drive and path are not part of the program name, the current directory will be examined first and then the DOS path will be searched to find the desired executable file. If the "program-name" doesn't have an extension of .EXE, .COM, .PIF, or .BAT, it will be run in accordance with whatever is in the [extensions] section of the WIN.INI file. When this happens, any "parameters" you specified are ignored. Note: When this command launches an application it merely informs it that you want it to be maximized to full-screen. Whether or not the application honors your wish is beyond RunZoom's control. Examples: RunZoom("Notepad.exe","abc.txt") RunZoom("clock.exe","") RunZoom("paint.exe","pict.msp") See Also: Run, RunHide, RunIcon, WinZoom, WinClose, WinWaitClose 109 CPML FUNCTION REFERENCE SetDisplay Controls the display of files in the Command Post File Manager window. Syntax: SetDisplay (detail, sort-by, masks) Parameters: "detail" = level of detail. Use "SHORT" or "LONG". "sort-by" = how to sort the filenames. Use "NAME", "KIND", "SIZE", "DATE" or "UNSORTED". "masks" = list of masks for file display. Returns: (integer) @TRUE if valid options were specified; @FALSE if invalid. Use this command to change and/or update the file display. Any of the fields may be null. If a field is null the previous setting is used. This command will alter the file display Parameters:, and then re-read all the files and update the display. A special form of this command, SETDISPLAY ("","",""), will update the file display without changing any of the previously set Parameters. Errors: 2105 "SetDisplay: Display type not SHORT or LONG" 2106 "SetDisplay: Sort Type not NAME, DATE, SIZE, KIND, or UNSORTED" Example: Windows &SDK &Show SDK Development Files SetDisplay ("","","*.ICO *.CUR *.BMP *.DLG *.H") 110 CPML FUNCTION REFERENCE StrCat Concatenates two or more strings. Syntax: StrCat (string1, string2[, stringN]...) Parameters: "string1", etc = at least two strings you want to "string" together (so to speak). Returns: (string) concatenation of the entire list of input strings. Use this command to stick character strings together, or to format display messages. Errors: 2058 "StrCat function syntax error" Example: User=AskLine("Login", "Your Name:", "") Message("Login",strcat("Hi, ",User)) ;note that this will do the same: Message("Login","Hi, %User%") See Also: StrFill, StrFix, StrTrim 111 CPML FUNCTION REFERENCE StrCmp Compares two strings. Syntax: StrCmp (string1, string2) Parameters: "string1", "string2" = strings to compare. Returns: (integer) -1, 0, or 1; depending on whether string1 is less than, equal to, or greater than string2, respectively. Use this command to determine whether two strings are equal, or which precedes the other in an ASCII sorting sequence. Note: This command has been included for semantic completeness. The relational operators >, >=, ==, !=, <=, and < provide the same capability. Example: a=AskLine("STRCMP","Enter a test line","") b=AskLine("STRCMP","Enter another test line","") c=strcmp(a,b) c=c+1 d=strsub("less than equal to greater than",c*12,12) ;Note that above string is grouped into 12-character chunks. ;Desired chunk is removed with the strsub statement. message("STRCMP","%a% is %d% %b%") See Also: StrICmp, StrIndex, StrLen, StrScan, StrSub 112 CPML FUNCTION REFERENCE StrFill Creates a string filled with a series of characters. Syntax: StrFill (filler, length) Parameters: "filler" = a string to be repeated to create the return string. If the filler string is null, spaces will be used instead. "length" = the length of the desired string. Returns: (string) character string. Use this function to create a string consisting of multiple copies of the filler string concatenated together. Example: Message("My Stars",strfill("*",30)) See Also: StrCat, StrFix, StrLen, StrTrim 113 CPML FUNCTION REFERENCE StrFix Pads or truncates a string to a fixed length. Syntax: StrFix (base-string, pad-string, length) Parameters: "base-string" = string to be adjusted to a fixed length. "pad-string" = appended to "base-string" if needed to fill out the desired length. If "pad-string" is null, spaces are used instead. "length" = length of the desired string. Returns: (string) fixed size string. This function "fixes" the length of a string, either by truncating it on the right, or by appending enough copies of pad-string to achieve the desired length. Example: a=StrFix("Henry"," ",15) b=StrFix("Betty"," ",15) c=StrFix("George"," ",15) Message("Spaced Names",strcat(a,b,c)) See Also: StrFill, StrLen, StrTrim 114 CPML FUNCTION REFERENCE StriCmp Compares two strings without regard to case. Syntax: StrICmp (string1, string2) Parameters: "string1", "string2" =strings to compare. Returns: (integer) -1, 0, or 1; depending on whether string1 is less than, equal to, or greater than string2, respectively. Use this command to determine whether two strings are equal, or which precedes the other in an ACSII sorting sequence, when case is ignored. Example: a=AskLine("STRICMP","Enter a test line","") b=AskLine("STRICMP","Enter another test line","") c=stricmp(a,b) c=c+1 d=strsub("less than equal to greater than",c*12,12) ;Note that above string is grouped into 12-character chunks. ;Desired chunk is removed with the strsub statement. message("STRICMP","%a% is %d% %b%") See Also: StrCmp, StrIndex, StrLen, StrScan, StrSub 115 CPML FUNCTION REFERENCE StrIndex Searches a string for a substring. Syntax: StrIndex (string, sub-string, start, direction) Parameters: "string" = the string to be searched for a substring. "substring" = the string to look for within the main string. "start" = the position in the main string to begin the search. The first character of a string is position 1. "direction" = the search direction. @FWDSCAN searches forward, while @BACKSCAN searches backwards. Returns: (integer) position of "sub-string" within "string"; 0 if not found. This function searches for a substring within a "target" string. Starting at the "start" position, it goes forward or backward depending on the value of the "direction" parameter. It stops when it finds the "substring" within the "target" string, and returns its position. A start position of 0 has special meaning depending on which direction you are scanning. For forward searches zero indicates the search should start at the beginning of the string. For reverse searches zero causes it to start at the end of the string. Errors: 3100 "StrIndex/StrScan 3rd parameter out of bounds" Example: Instr = AskLine ("STRINDEX", "Type a sentence:", "") start=1 end=strindex(InStr," ",start,@FWDSCAN) terminate(end==0,"Sorry...","No spaces found") message("STRINDEX",strcat("The first word is: ", strsub(InStr,start,end-1)) exit See Also: StrLen, StrScan, StrSub 116 CPML FUNCTION REFERENCE StrLen Provides the length of a string. Syntax: StrLen (string) Parameters: "string" = any text string. Returns: (integer) length of string. Use this command to determine the length of a string variable or expression. Example: MyFile=AskLine("Filename","File to process:","") FilenameLen=strlen(MyFile) Terminate(FilenameLen>13, "", "Filename too long!") See Also: StrFill, StrFix, StrIndex, StrScan, StrTrim 117 CPML FUNCTION REFERENCE StrLower Converts a string to lowercase. Syntax: StrLower (string) Parameters: "string" = any text string. Returns: (string) lowercase string. Use this command to convert a text string to lower case. Example: a=AskLine("STRLOWER","Enter text","") b=strlower(a) message(a,b) See Also: StrICmp, StrUpper 118 CPML FUNCTION REFERENCE StrScan Searches string for occurrence of delimiters. Syntax: StrScan (string, delimiters, start, direction) Parameters: "string" = the string that is to be searched. "delimiters" = a string of delimiters to search for within "string". "start" = the position in the main string to begin the search. The first character of a string is position 1. "direction" = the search direction. @FWDSCAN searches forward, while @BACKSCAN searches backwards. Returns: (integer) position of delimiter in string, or 0 if not found. This function searches for delimiters within a target "string". Starting at the "start" position, it goes forward or backward depending on the value of the "direction" parameter. It stops when it finds any one of the characters in the "delimiters" string within the target "string". Errors: 3100 "StrIndex/StrScan 3rd parameter out of bounds" Example: TheStr="123,456.789:abc" start=1 end=strscan(TheStr,",.:",start,@FWDSCAN) terminate(end==0,"Sorry...","No delimiters found") message("The first parameter",strsub( TheStr,start,end-start+1)) exit See Also: StrLen, StrSub 119 CPML FUNCTION REFERENCE StrSub Extracts a substring out of an existing string. Syntax: StrSub (string, start, length) Parameters: "string" = the string from which the substring is to be extracted. "start" = character position within "string" where the sub-string starts. (The first character of the string is at position 1). "length" = length of desired substring. If you specify a length of zero it will return a null string. Returns: (string) substring of parameter string. This function extracts a substring from within a "target" string. Starting at the "start" position, it copies up to "length" characters into the substring. Errors: 3059 "Illegal Bounds for STRSUB function" Example: a="My dog has fleas" animal=strsub(a,4,3) Message("STRSUB","My animal is a %animal%") See Also: StrLen, StrScan 120 CPML FUNCTION REFERENCE StrTrim Removes leading and trailing spaces from a character string. Syntax: StrTrim (string) Parameters: "string" = a string with unwanted spaces at the beginning and/or the end. Returns: (string) string devoid of leading and trailing spaces. Use this function to remove unwanted spaces from the beginning and end of text data. Example: TheFile = AskLine("STRTRIM","Filename ('exit' cancels)","") TstExit = strtrim(strlower(TheFile)) Terminate(TstExit=="exit","Cancelled","...by user request") ;processing of TheFile continues... See Also: StrFill, StrFix, StrLen 121 CPML FUNCTION REFERENCE StrUpper Converts a string to uppercase. Syntax: StrUpper (string) Parameters: "string" = any text string. Returns: (string) uppercase string. Use this function to convert a text string to upper case. Example: a=AskLine("STRUPPER","Enter text","") b=strupper(a) message(a,b) See Also: StrICmp, StrLower 122 CPML FUNCTION REFERENCE Terminate Conditionally ends the menuitem. Syntax: Terminate (expression, title, message) Parameters: "expression" = any logical expression. "title" = the title of a message box to be displayed before termination. "message" = the message in the message box. Returns: (integer) always @TRUE. This command ends processing for the menu item if "expression" is nonzero. Note that many functions return @TRUE (1) or @FALSE (0), which you can use to decide whether to cancel a menu item. If either "title" or "message" contains a string, a message box with a title and a message is displayed before exiting. Examples: ;Unconditional Termination w/o message box. ;Same as "Exit": Terminate(@TRUE,"","") ;Basically a no-op: Terminate(@FALSE,"","This will never terminate") ;Exits with message if a is less than zero: Terminate(a<0,"Error","Cannot use negative numbers") ;Exits w/o message if answer isn't "YES": Terminate(answer!="YES","","") See Also: Display, Pause, Message 123 CPML FUNCTION REFERENCE TextBox Displays a file in a listbox on the screen and returns selected line, if any. Syntax: TextBox (title, filename) Parameters: "title" = listbox title. "filename" =file containing contents of listbox. Returns: (string) = highlighted string, if any. The TextBox command loads a file into a Windows listbox and displays the listbox to the user. The command has two primary uses: First off, it can be used to display multi-line messages to the user. In addition, because of its ability to return a selected line, it may be used as a multiple choice question box. The line highlighted by the user (if any) will be returned to the program. If disk drive and path not are part of the filename, the current directory will be examined first, and then the DOS path will be searched to find the desired file. Example: ;Display config.sys: a=TextBox("Choose a line","C:\CONFIG.SYS") display(3,"Chosen line",a) See Also: ItemSelect 124 CPML FUNCTION REFERENCE Version Returns the version number of the currently-running Command Post language processor. Syntax: Version ( ) Returns: (string) = Command Post version number. Use this function to determine the version of Command Post that is running. It is useful to verify that a menu generated with the latest version of the language will operate properly on what may be a different machine with a different version of Command Post installed. Example: a=Version() See Also: Environment, WinVersion 125 CPML FUNCTION REFERENCE WinActivate Activates a previously running window. Syntax: WinActivate (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be activated. Returns: (integer) @TRUE if a window was found to activate; @FALSE if no windows were found. Use this command to activate windows for user input. Errors: 1045 "WinActivate: Window not found" Example: Run("notepad.exe","") Run("clock.exe","") WinActivate("Notepad") See Also: WinCloseNot, WinGetActive, WinShow 126 CPML FUNCTION REFERENCE WinArrange Arranges, tiles, and/or stacks application windows. Syntax: WinArrange (style) Parameters: style = one of the following: @STACK, @TILE (or @ARRANGE), @ROWS, or @COLUMNS. Returns: (integer) always @TRUE. Use this command to rearrange the open windows on the screen. (Any iconized programs are unaffected.) @STACKED @TILED @ROWS @COLUMNS When you specify @ROWS and you have more than four open windows, or if you specify @COLUMNS and you have more than three open windows, Command Post will revert to @TILE. See Also: WinItemize, WinHide, WinIconize, WinPlace, WinShow, WinZoom 127 CPML FUNCTION REFERENCE WinClose Closes an open window. Syntax: WinClose (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be closed. Returns: (integer) @TRUE if a window was found to close; @FALSE if no windows were found. Use this command to close windows. This command will not close the current Command Post window. You can, however, call EndSession to end the current Windows session. Errors: 1039 "WinClose: Window not found" Example: Run ("notepad.exe","") WinClose("Notepad") See Also: WinCloseNot, WinHide, WinIconize, WinWaitClose 128 CPML FUNCTION REFERENCE WinCloseNot Closes all windows, except those provided as parameters:. Syntax: WinCloseNot (partial-windowname [, partial-windowname]...) Parameters: partial-windowname = either an initial portion of, or an entire window name. Any windows whose titles match the partial names will stay open. Returns: (integer) always @TRUE. Use this command to close all windows except those specifically listed in the parameter strings. At least one partial windowname must be given. A null-string parameter would match all windows, or in other words close nothing. Errors: 2038 "WinCloseNot Function Syntax error" Example: ;The statement below will close all windows except: ;1) MS-DOS Executive (starts with 'MS-D') ;2) Clock (starts with 'Clo' ) WinCloseNot("MS-D","Clo") See Also: WinItemize, WinClose, WinHide, WinIconize, WinWaitClose 129 CPML FUNCTION REFERENCE WinGetActive Gets the title of the active window. Syntax: WinGetActive ( ) Returns: (string) title of active window. Use this command to determine which window is currently active. Example: CurrentWin=WinGetActive() See Also: WinItemize, WinActivate 130 CPML FUNCTION REFERENCE WinHide Hides a window. Syntax: WinHide (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be hidden. Returns: (integer) @TRUE if a window was found to hide; @FALSE if no windows were found. Use this command to hide windows. The programs are still running when they are hidden. A partial-windowname of "" hides the current Command Post window. Errors: 1040 "WinHide: Window not found" Example: Run("notepad.exe","") WinHide("Notepad") WinShow("Notepad") See Also: WinClose, WinIconize, WinPlace 131 CPML FUNCTION REFERENCE WinIconize Iconizes a window. Syntax: WinIconize (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be iconized. Returns: (integer) @TRUE if a window was found to iconize; @FALSE if no windows were found. Use this command to turn a window into an icon at the bottom of the screen. A partial-windowname of "" iconizes the current Command Post window. Errors: 1041 "WinIconize: Window not found" Example: Run("clock.exe","") WinIconize("Clo") ; partial window name used here See Also: WinClose, WinHide, WinPlace, WinShow, WinZoom 132 CPML FUNCTION REFERENCE WinItemize Returns a tab-delimited list of all open windows. Syntax: WinItemize ( ) Returns: (string) list of all open windows' titles. This function compiles a list of all the open application windows' titles and separates the titles by tabs. This is especially useful in conjunction with the ItemSelect function, which enables the user to choose an item from such a tab-delimited list. Note this behaves somewhat differently than FileItemize and DirItemize, which create space-delimited lists. This is because window titles regularly contain embedded spaces. Example: &Windows &Find a window AllWins = WinItemize() HTab = Num2Char(9) MyWind = ItemSelect("Windows",AllWins, HTab) WinActivate(MyWind) See Also: DirItemize, FileItemize, ItemSelect 133 CPML FUNCTION REFERENCE WinPlace Places a window anywhere on the screen. Syntax: WinPlace (x-ulc, y-ulc, x-brc, y-brc, partial-windowname) Parameters: x-ulc = how far from the left of the screen to place the upper- left corner (0-1000). y-ulc = how far from the top of the screen to place the upper- left corner (0-1000). x-brc = how far from the left of the screen to place the bottom-right corner (10-1000) or @NORESIZE. y-brc = how far from the top of the screen to place the bottom- right corner (10-1000) or @NORESIZE or @ABOVEICONS. "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be moved to the new position. Returns: (integer) @TRUE if a window was found to move; @FALSE if no windows were found. Use this command to move windows on the screen. (You cannot, however, move icons or windows that have been maximized to full screen.) A partial-windowname of "" moves the current Command Post window. The "x-ulc", "y-ulc", "x-brc", and "y-brc" parameters are based on a logical screen that is 1000 points wide by 1000 points high. You can move the window without changing the width and/or height by specifying @NORESIZE for the "x-brc" and/or "y-brc" parameters, respectively. You can fix the bottom of the window to sit just above the line of icons along the bottom of the screen by specifying a "y-brc" of @ABOVEICONS. Some sample parameters: Upper left quarter of the screen: 0, 0, 500, 500 Upper right quarter: 500, 0, 500, 1000 Center quarter: 250, 250, 750, 750 Lower left eighth: 0, 750, 500, 1000 134 CPML FUNCTION REFERENCE A handy utility program is included with Command Post, called WinInfo.exe. This program lets you take an open window that is sized and positioned the way you like it, and automatically create the proper WinPlace statement for you. It puts the text into the Clipboard, from which you can paste it into your menu code: You'll need a mouse to use WinInfo. While WinInfo is the active window, place the mouse over the window you wish to create the WinPlace statement for, and press the spacebar. The new statement will be placed into the Clipboard. Then press the Esc key to close WinInfo. Errors: 1044 "WinPlace: Window not found" Example: WinPlace(0,0,200,200,"Clock") See Also: WinArrange, WinHide, WinIconize, WinShow, WinZoom 135 CPML FUNCTION REFERENCE WinShow Shows a window in its "normal" state. Syntax: WinShow (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be shown. Returns: (integer) @TRUE if a window was found to show; @FALSE if no windows were found. Use this command to restore a window to its "normal" size and position. A partial-windowname of "" restores the current Command Post window. Errors: 1043 "WinShow: Window not found" Example: RunZoom("notepad.exe","") ;other processing... WinShow("Notepad") See Also: WinArrange, WinHide, WinIconize, WinZoom 136 CPML FUNCTION REFERENCE WinTitle Changes the title of a window. Syntax: WinTitle (partial-windowname, new-name) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be shown. "new-name" =the new name of the window. Returns: (integer) @TRUE if a window was found to rename; @FALSE if no windows were found. Use this command to change a window's title. A partial-windowname of "" refers to the current Command Post window. Note: Some applications may rely upon their window's title staying the same! It should be used with caution and adequate testing. Example: &Windows (special) Make &Uppercase HTab = Num2Char(9) AllWinds = WinItemize() MyWin=ItemSelect("Uppercase Windows", AllWinds, HTab) WinTitle(MyWin, StrUpper(MyWin)) Drop (HTab, AllWinds, MyWin) See Also: WinItemize 137 CPML FUNCTION REFERENCE WinVersion Provides the version number of the current Windows system. Syntax: WinVersion (level) Parameters: "level" = either @MAJOR or @MINOR. Returns: (integer) either major or minor part of the Windows version number. Use this command to determine which version of Windows is currently running. @MAJOR returns the integer part of the Windows version number; i.e. 1.0, 2.11, 3.0, etc. @MINOR returns the decimal part of the Windows version number; i.e. 1.0, 2.11, 3.0, etc. Example: &Info Windows &Version MinorVer=WinVersion(@MINOR) MajorVer=WinVersion(@MAJOR) Message("Windows Version",strcat(MajorVer,".",MinorVer)) See Also: Version 138 CPML FUNCTION REFERENCE WinWaitClose Suspends the menu execution until a specified window has been closed. Syntax: WinWaitClose (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. WinWaitClose suspends execution until all matching windows have been closed. Returns: (integer) @TRUE if at least one window was found to wait for; @FALSE if no windows were found. Use this command to suspend the menu item's execution until the user has finished using a given window and has manually closed it. Example: ;WinWaitClose command example run("clock.exe","") Display(4,"Note","Close Clock to continue") WinWaitClose("Clock") Message("Continuing...","Clock closed") See Also: Delay, Yield 139 CPML FUNCTION REFERENCE WinZoom Maximizes a window to full-screen. Syntax: WinZoom (partial-windowname) Parameters: "partial-windowname" = either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be shown. Returns: (integer) @TRUE if a window was found to zoom; @FALSE if no windows were found. Use this command to "zoom" windows to full screen size. A partial-windowname of "" zooms the current Command Post window. Errors: 1042 "WinZoom: Window not found" Example: Run("notepad.exe","") WinZoom("Notepad") WinShow("Notepad") See Also: WinHide, WinIconize, WinPlace, WinShow 140 CPML FUNCTION REFERENCE Yield Provides time for other windows to do processing. Syntax: Yield Returns: nothing. Use this command to give other running windows time to process. This command will allow each open window to process 20 or more messages. Example: ;run PageMaker and give it some time to start up... PMFile = AskLine ("PageMaker", "File to run:", "") run("PM.EXE", PMFile) yield yield yield See Also: Delay 141 APPENDIX A Browser APPENDIX A Browser The Command Post Browser program lets you view a file's contents in a variety of ways. The default is to show the file in Windows' "ANSI text" mode: Initial Browser View - ANSI Text As you can see, Browser gives you five main menus to choose from: File These menu items let you open a new file to view, re-read the current file, and perform other housekeeping functions including exiting the program. Hide & Seek Browser gives you the ability to filter which lines you view with its Hide & Seek commands. You can hide or show specific lines by entering a word to look for. For instance, the menu item Hide & Seek/Show if... displays this dialog box: ...and (in this example) shows only the lines containing the word "modem": 142 APPENDIX A Browser Print *** Not currently available---We're working on it*** These selections allow you to print all or part of the file. Clip Copy Lets you copy portions of the file into the Windows Clipboard. Clip Append Lets you add portions of the file onto the end of the Windows Clipboard. Options These menu items let you change how you view the file; changing for example between ASCII text mode (which interprets some special characters differently than ANSI text) and hex-dump formats: Options/ASCII text Options/Hex dump 143 APPENDIX B Command Post and Windows 3.0 APPENDIX B Command Post and Windows 3.0 Command Post as Your Shell Normally, Command Post is automatically launched along with the Program Manager, since it is included on the "Run=" line of the WIN.INI file. With Windows 3.0 you can also install Command Post as your primary shell. Perhaps you want to save memory, or avoid having to deal with Windows' Program Manager. It's easy: Using the Notepad editor, edit the SYSTEM.INI file found in your Windows directory. A few lines down from the top you will find a line that reads (as shipped by Microsoft) shell=progman.exe Change this line to: shell=cmdpost.exe Save the file and restart Windows. Command Post will now appear in place of Program Manager. 145 APPENDIX B Command Post and Windows 3.0 The Windows 3.0 Task Manager Windows 3.0 uses a special program called the Task Manager (TASKMAN.EXE). The Task Manager is invoked whenever you do any of the following: 1) Press CTRL-ESC 2) Select Switch To... from the system menu of any application 3) Doubleclick on the screen background with the mouse. The Task Manager supplied with Windows brings up a dialog box which lets you choose which window to go to. Command Post gives you most of Task Manager's functionality. For this reason, we have supplied a replacement TASKMAN.EXE with which you can replace Microsoft's version. Our Task Manager will simply bring up Command Post. To replace Microsoft's TASKMAN.EXE with ours: 1) Rename Microsoft's TASKMAN.EXE to something different, such as TASKMANG.EXE. 2) Copy the TASKMAN.EXE from the Command Post installation directory to your Windows directory. This procedure is done automatically in the Command Post installation program if you choose the appropriate options. Windows' Task Manager has one feature that Command Post lacks: In some instances it lets you shut down otherwise recalcitrant programs with the End Task button. You might want to keep Windows' Task Manager as a Command Post menu item: &Utilities &Task Manager Run ("Taskmang.exe", "") 146 APPENDIX C CPML Programming Tricks APPENDIX C CPML Programming Tricks Fun With Filenames Sometimes you need to take a pathname and extract the drive letter, directory path, or filename from it. The CPML string functions help you do this. Getting the drive letter is relatively easy. Just make sure there's a colon in the pathname in at least the second character position. If there is, take the character just before it: FullPath = AskLine ("", "Enter a full pathname", "") ColonIsAt= StrIndex(FullPath, ":",1, @FWDSCAN) ;if no colon or is first char, return "" drive letter: LetterLen = Min (Max (ColonIsAt-1, 1), 0) DriveLetter = StrSub(FullPath, ColonIsAt-1, 1) Drop (ColonIsAt, LetterLen) The colon could come later than position #2 if the pathname includes a network address before the drive letter. Getting the directory path is accomplished by finding the last backslash character and taking everything before that point. Note when using StrIndex to search backwards from the end of a string, we use a start position of 0: Slash= StrIndex (FullPath, "\", 0, @BACKSCAN) DirPath = StrSub (FullPath, 1, Slash-1) Drop (Slash) The filename is extracted in a similar manner: Slash = StrIndex (FullPath, "\", 0, @BACKSCAN) FName = StrSub (FullPath, Slash+1, StrLen(FullPath) -Slash) Drop (Slash) Once you have a filename you can extract its root. First find the dot. If there isn't any, proceed as if it was at the end. In either case take the portion of the filename before the dot: DotIsAt = StrIndex (FileName,".",0,@FWDSCAN) DotIsAt = DotIsAt*(DotIsAt!=0) + (StrLen(FileName)+1)*(DotIsAt==0) RootFileName=StrSub (FileName,1,DotIsAt-1) Drop (DotIsAt) 147 APPENDIX C CPML Programming Tricks Getting the extension is easier: DotIsAt = StrIndex (FileName,".",0,@FWDSCAN) Terminate (DotIsAt==0,"","File has no extension") Ext= StrSub (FileName, DotIsAt+1, StrLen(FileName)-DotIsAt) Drop (DotIsAt) Making a Free-Floating Menu The Command Post directory window, coupled with the default menu in CMDPOST.CPM, provides you with a more-useful file manager than is provided by Windows version 2.x. However there are times when all you'd rather see is your custom menu bar without the directory listing, perhaps nestled down at the lower-right hand corner of the screen. This can be done rather easily in the initialization section of your custom menu file with the WinPlace command: ThisWin = WinGetActive() WinTitle (ThisWin, "Jenny's Favorites") ;get these dimensions from WININFO.EXE: WinPlace (710,872,1000,966,"Jenny's Favorites") When a Program is Already Running When you launch a program from a menu and it's already running, some times you'd rather just activate the window that's running instead of invoking another instance of the same program: &Desktop &Clock ErrorMode (@OFF) ; Turn Errors Off Terminate (WinActivate("Clock"),"","") ; Already running ErrorMode (@CANCEL) ; Re-enable default error mode Run ("Clock.exe","") Working With Lists When selecting a menu item to run an application program, you can choose a file for the program to open from among all the appropri- ate files in the current directory. For example, assume we want to choose from among the .WRI files, and then run Windows Write with the one we highlighted. If the user presses OK without selecting a file, we'll still run Write, but we won't open a file: HTab = Num2Char (09) WRIFiles = FileItemize("*.WRI") TheFile = ItemSelect(".WRI file, or just OK for new file",WRIFiles, HTab) RunZoom ("Write.exe", TheFile) Drop (WRIFiles, TheFile, HTab) 148 APPENDIX C CPML Programming Tricks We don't have to restrict ourselves to a single wildcard when we itemize files. And if we've set up an association between the file extensions we're itemizing on and the programs that create them, we don't have to restrict ourselves to a single program, either. For example, let's show a list of all our compressed files in the current directory, allow the user to choose one, and run the appropriate decompression program against it. (This assumes we've set up associations between these extensions and their respective compression programs in WIN.INI's [Extensions] section): &Utilities &Compress a file Files = FileItemize ("*.ZIP *.LZH *.ARC *.PAK *.PKA") TheFile = ItemSelect ("Choose a File", FileList, " ") Run (TheFile,"") Drop(FileList, TheFile) Of course, we don't have to itemize just by extension, either. Any kind of wildcard will do. We can even itemize full pathnames. Conditional Branching CPML does not have any branching statements. The closest it comes to having an "if" statement is the Terminate function, which will end the menu item if a specified condition is true. However you can accomplish more useful conditional branching by using string manipulation and the powerful %substitution% feature of the language. Here's the basic technique: Test your condition, negate it, and use the result (@TRUE = 1 or @FALSE = 0) as the "length" parameter in a StrSub function to assign either a ";" or the zero-length null string "" to a variable. Then, substitute this variable's contents into the beginning of each statement you want to execute when the condition is true. When the condition you tested is true, the statements are executed normally. But when the condition is false, a ";" is inserted at the beginning of the lines, making them com- ments and causing those statements to be ignored! Example: You prefer Notepad for simple text editing. But it can't handle files longer than approximately 50,000 bytes in Windows 3.0 (17,000 in Windows 2.x). So let's call Word for Windows if our file is too long: 149 APPENDIX C CPML Programming Tricks &Word Processing &Simple Editing ;assuming MyFile contains the filename we want... TooBig = !(FileSize(MyFile) > 49000) IfTooBig = strsub(";",1, TooBig) IfNotTooBig = strsub(";",1,!TooBig) execute %IfNotTooBig% RunZoom ("Notepad", MyFile) execute %IfTooBig% RunZoom ("D:\winword\WinWord",MyFile) Be sure to use the Execute command in front of the substituted variable, or else you will encounter an error. If these capabilities aren't powerful enough for your needs, you may want to consider having the menu item call a PubTech BatchWorks batch program. The BatchWorks language is upwardly-compatible with CPML (and in fact was also written by us). BatchWorks creates free-standing batch files within which you can have conditionals, loops, subroutines, and extensive dialog boxes defined in addition to the standard CPML functions and commands described here. A BatchWorks file can also be invoked directly from the Windows v3.0 Program Manager. The Command Post Clock The Command Post package includes a screen blanker/clock application. The executable is called CP_BLNK.EXE, and is used in the default CMDPOST.CPM menu. CP_BLNK.EXE takes one parameter, which is the minutes to delay before blanking the screen. The parameter may be a positive, zero, or negative number: Screen Clock Clock Off Blanking Displayed Positive Negative ON number number Zero Don't run OFF CP_BLNK.EXE Examples: Run("cp_blnk.exe",5) ; Display clock. Blank in 5 minutes. Run("cp_blnk.exe",0) ; Display clock. Never Blank. Run("cp_blnk.exe",-5) ; No clock. Blank in 5 minutes. If you start the blanker with a zero or positive number, a clock will appear in the lower right of the screen. Initially the clock will merely display the Command Post version number. See pg. 23 for how to use the Clock once it's onscreen. 150 APPENDIX D Predefined Constants APPENDIX D Predefined Constants CPML provides you with a number of predefined integer constants to help make your menus more mnemonic: Logical Conditions String Handling @FALSE @FWDSCAN @NO @BACKSCAN @OFF @TRUE Menu Handling @YES @ENABLE @ON @DISABLE @UNCHECK Window Arranging @CHECK @NORESIZE System Control @ABOVEICONS @MAJOR @STACK @MINOR @ARRANGE @TITLE Error Handling @ROWS @CANCEL @COLUMNS @NOTIFY @OFF 151 APPENDIX E Errors APPENDIX E Errors If the current error mode is @CANCEL (the default), any CPML errors encountered while processing a menu item cause the item to be cancelled with an error message. Minor Errors Minor errors are ignored if the current error mode has been set to @OFF. If the error mode is @NOTIFY the user has the option of continuing with the menu item or cancelling it. 1006 File Copy/Move: No matching files found 1017 File Delete: No matching files found 1018 File Delete: Delete Failed 1024 File Rename: No matching files found 1025 File Rename: Rename failed 1028 LogDisk: Requested drive not online 1029 DirMake: Dir not created 1030 DirRemove: Dir not removed 1031 DirChange: Dir not found/changed 1039 WinClose: Window not found 1040 WinHide: Window not found 1041 WinIconize: Window not found 1042 WinZoom: Window not found 1043 WinShow: Window not found 1044 WinPlace: Window not found 1045 WinActivate: Window not found Moderate Errors If the error mode is @NOTIFY or @OFF, the user has the option of continuing with the menu item or cancelling it. 2002 File Copy/Move: 'From' file illegal 2003 File Copy/Move: 'To' file illegal 2004 File Copy/Move: Cannot copy/move wildcards into fixed root 2005 File Copy/Move: Cannot copy/move wildcards into fixed extension 2007 File Move: Unable to rename source file 2015 File Move: Unable to remove source file 2016 File Delete: File name illegal 2019 File Rename: 'From' file illegal 2020 File Rename: 'To' file illegal 2021 File Rename: Attempt to rename across drive boundary. - Use MOVE instead. 2022 File Rename: Cannot rename wildcards into a fixed filename root 153 APPENDIX E Errors 2023 File Rename: Cannot rename wildcards into a fixed filename extension 2038 WinCloseNot Function Syntax error 2058 StrCat function syntax error 2060 Average function syntax error 2105 SetDisplay: Display type not SHORT or LONG 2106 SetDisplay: Sort Type not NAME, DATE, SIZE, KIND, or UNSORTED Fatal Errors Fatal errors cause the current menu item to be cancelled with an error message, regardless of the error mode in effect. (We show the error codes here for consistency, but in practice you will never be able to call LastError after a fatal error.) 3008 File Copy/Move: 'From' file open error 3011 File Copy/Move: 'From' file length error 3012 File Copy/Move: No room left on disk. Out of space?? 3013 File Copy/Move: 'To' file open error 3014 File Copy/Move: I/O Error 3026 LogDisk: Illegal disk drive 3027 LogDisk: DOS reports no disks!! ??? 3034 Clipboard owned by another app. Cannot open. 3035 Clipboard does not contain text for ClipAppend. 3036 Clipboard cannot hold that much text (>64000 bytes) 3037 Unable to allocate memory for clipboard. Close some applications 3046 Internal Error 3046. Function not defined 3047 Variable name over 30 chars. Too Long 3048 Substitution %Variable% not followed by a % (Use %% for %) 3049 No variables exist??!! 3050 Undefined variable 3051 Undefined variable or function 3052 Uninitialized variable or undefined function 3053 Character string too long (>256 chars??) 3054 Unrecognizable item found on line 3055 Variable name is over 30 chars. Too Long 3056 Variable could not be converted to string 3057 Variable could not be converted to integer 3059 Illegal Bounds for StrSub function 3061 Illegal Syntax 3062 Attempt to divide by zero 3063 Internal Error 3063. Binary op not found 3064 Internal Error 3064. Unary op not found 3065 Unbalanced Parenthesis 3066 Wrong Number of Arguments in Function 3067 Function Syntax. Opening parenthesis missing. 3068 Function Syntax. Illegal delimiter found. 3069 Illegal assignment statement. (Use == for equality testing) 3070 Internal error 3070. Too many arguments defined. 3071 Missing or incomplete statement 3074 Expression continues past expected end. 154 APPENDIX E Errors 3081 FileRead: Invalid file handle 3082 FileRead: File not currently open 3084 FileWrite: Invalid file handle 3085 FileWrite: File not currently open 3087 FileRead: File not open for reading 3088 FileRead: Attempt to read past end of file 3089 FileWrite: File not open for writing 3095 Compare could not be resolved into a integer or string compare 3096 Memory allocation failure. Out of memory for string storage 3097 Memory allocation failure. Out of memory for variable storage 3098 Internal error, NULL pointer passed to xstrxxx subroutines 3100 StrIndex/StrScan 3rd parameter out of bounds 3101 Substituted line too long. (> 256 characters) 3102 Drop: Can only drop variables 3103 IsDefined: Attempting to test non-variables item 3107 Run: Filetype is not COM, EXE, PIF or BAT 3108 FileItemize: Unable to lock file info segment 3109 FileItemize: Unable to unlock file info segment 3110 FileItemize: Unable to lock file index segment 3111 FileItemize: Unable to unlock file index segment 3112 FileSize: File Not Found 3113 FileSize: Filelength I/O Error 3114 FileSize: Buffer Overrun Error 3115 FileDelete: Buffer Overrun Error 3116 FileRename: Buffer Overrun Error 3117 FileCopyMove: Buffer Overrun Error 3118 FileCopyMove: Destination file same as source 155 Index Index Display 42,73-74 # Drop 46,74-75 #NextFile 103-104 E A EndSession 46,75-76 Abs 45,52 Environment 46,76-77 AskLine 29,42,52-54 ErrorMode 46,77-78 AskYesNo 29,42,54-55 Errors 41-42,157-160 Average 45,55-56 fatal 158-160 minor 157 B moderate 157-158 Beep 42,56-57 see also Debug, ErrorMode, LastError C Execute 46,78-79 Char2Num 45,57-58 Exit 46,79-80 ClipAppend 46,58-59 ClipGet 46,59-60 F ClipPut 46,60-61 File Management Clock, Command Post default "File" menu 6-12 default action 23 in CPML 42-43 in CPML 154 FileCopy 42,80-81 cmdpost.cpm 3,25 FileDelete 43,81-82 and #NextFile 104 FileExist 43,82-83 cmduser.cpm 3,25 FileItemize 43,83-84 and #NextFile 104 FileLocate 43,84-85 Comments 39 FileMove 43,85-86 Conditional Branching 153 FileRename 43,86-87 see also Terminate FileSize 43,87-88 Constants 36-37 predefined 37 H CurrentFile 31,42,61-62 Housekeeping "Main" menu 16-21 D DateTime 46,62-63 I Debug 46,63-65 Identifiers 37 Delay 46,65-66 IniRead 46,88-89 DirChange 31,43,66-67 IniWrite 46,89-90 Directives 41 IsDefined 46,90-91 see also #NextFile IsMenuChecked 44,91-92 Directory Management IsMenuEnabled 44,92-93 default "Dir" menu 12-14 IsNumber 45,93-94 in CPML 43 IsRunning 46,94-95 DirGet 43,67-68 ItemSelect 29,42,95-97 DirHome 43,68-69 DirItemize 43,69-70 J DirMake 43,70-71 JELL-O 54 DirRemove 43,71-72 DiskFree 43,72-73 K 156 IndexIndexIndex Keywords 38 as an icon 6 in CPML 44-45 L RunZoom 28,44,112-113 LastError 47,97-98 LogDisk 43,98-99 S Selecting files 4-6 M SetDisplay 47,113-114 Max 45,99-100 Statements 39-40 menu files 25-31 reference 47-146 CPML language components 36-41 StrCat 45,114-115 error handling 41-42 StrCmp 45,115-116 menu structure 35 StrFill 45,116-117 menuitems 35-36 StrFix 45,117-118 reloading changes 21-22 StrICmp 45,118-119 second file 103-104 StrIndex 45,119-120 statement summary 42-47 StrLen 45,120-121 statements 47-146 StrLower 45,121-122 MenuChange 44,100-101 StrScan 45,122-123 Message 30,42,101-102 StrSub 45,123-124 Microsoft Windows StrTrim 45,124-125 date & time formatting 63 StrUpper 45,125-126 determining the version Substitution 40-41 47,141-142 and StrCat 114-115 ending the session 11 System Menu 21-22 version 2.x ending the session 76 T MS-DOS Executive 3 Terminate 30,42,47,126-128 version 3.0 TextBox 42,128-129 ending the session 76 Min 46,102-103 V Variables 37-38 N Version 47,129 Num2Char 45,102-105 Views default "View" menu 14-16 O see also SetDisplay Operators 38-39 Precedence 39 W OtherDir 47,105-106 WinActivate 43,129-130 OtherUpdate 47,106-107 WinArrange 43,130-132 WinClose 44,132 P WinCloseNot 44,132-133 Pause 30,42,107-108 Window Management in CPML 43-44 R WinGetActive 44,133-134 Random 46,108-109 WinHide 44,134-135 Registration 21,163 WinIconize 44,135-136 Run 28,44,109-110 WinItemize 44,136-137 RunHide 44,110-111 WinPlace 44,137-139 RunIcon 28,44,111-112 WinShow 44,139-140 Running programs WinTitle 44,140-141 as a normal window 6 WinVersion 47,141-142 157 WinWaitClose 44,142-143 Yield 47,144-145 WinZoom 44,143-144 Y 158 I want my OWN copy of Command Post! Please send it to: Company:__________________________________________________________ Name:__________________________________________________________ Address:__________________________________________________________ City:_____________________________St:__________Zip:____________ Phone:(_____)___________________ Country: _____________________ ____Command Post(s) @$49.95 ea.:____________ Foreign air shipping (except Canada) @$9.50:____________ Total:____________ Please enclose a check payable to Wilson WindowWare; or you may use Visa, MasterCharge, or EuroCard. For charge cards, please enter the information below: Card number: __ __ __ __-__ __ __ __-__ __ __ __-__ __ __ __ Expiration date: _______/______ Signature:_________________________________________________________ Send to: Wilson WindowWare 2701 California Ave SW #212 Seattle, WA 98116 USA or call: (800) 762-8383 (206) 935-7129 (fax) (Please allow 2 to 4 weeks for delivery)